首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我是否应该测试是否调用了存根方法?

我是否应该测试是否调用了存根方法?
EN

Stack Overflow用户
提问于 2010-02-25 15:04:31
回答 1查看 228关注 0票数 0

我刚刚开始使用MSpec ( James Broome的AutoMocking )和RhinoMocks学习BDD/TDD。以下是我的实践项目的摘录:

代码语言:javascript
复制
namespace Tests.VideoStore.Controllers
{
    public abstract class context_for_movie_controller :
    Specification<MovieController>
    {
        private static IList<Movie> movies;
        protected static IMovieRepository _movieRepository;
        protected static ActionResult _result;
        protected static string title;
        protected static string director;

        Establish context = () =>
        {
            _movieRepository = DependencyOf<IMovieRepository>();
        };
    }

    [Subject(typeof(MovieController))]
    public class when_searching_for_movies_with_director :
    context_for_movie_controller
    {
        Establish context = () =>
        {
            title = null;
            director = "James Cameron";

            var movie4 = new Movie {
                Title = "Terminator", Director = "James Cameron"};
            var movie6 = new Movie {
                Title = "Avatar", Director = "James Cameron"};

            movies = new List<Movie> {movie4, movie6};

            // Repository returns all movies.
            _movieRepository.Stub(x => x.FindMovies(title, director))
            .Return(movies);
        };

        Because of = () => _result = subject.Find(title, director);

        It should_fetch_movies_from_the_repository = () =>
            _movieRepository.AssertWasCalled(x =>
                x.FindMovies(title, director));

        It should_return_a_list_of_movies_matching_the_director = () =>
            _result.ShouldBeAView().And()
            .ShouldHaveModelOfType<IEnumerable<Movie>>)
            .And().ShouldContainOnly(movies);
    }

如您所见,我清除了MovieRepository类上的FindMovies()方法。然后我调用MoviesController.Find()操作。我的问题是,是否应该有一个断言来检查存根方法(FindMovies)是否由控制器调用?或者我应该只关心返回的结果,而不关心它是从哪里获得的?此外,写着"should_fetch_movies_from_the_repository“的规范看起来更像是一项工程任务,而不是客户可能理解的东西--它在BDD中有自己的位置吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-02-25 22:48:21

断言要遵循的一般规则是针对输出交互而不是输入交互进行断言。

FindMovies存根将一个" movies“集合返回给调用它的类,然后通过”它应该返回与导演匹配的电影列表“断言来验证该类是否收到了正确的列表。如果未调用FindMovies方法,则此断言将失败。

因此,您不需要针对FindMovies方法断言调用。

为了反驳这一点,如果您有一个纯输出的模拟或存根-比方说一个由Presenter类调用的IView接口,那么您确实希望对被调用的IView进行断言。例如,下面的代码:

代码语言:javascript
复制
public class MyPresenter
{
  ... other code here

  public DoSomething()
  {
    IList data = GetSomeData();
    myView.DisplayData(data);

  }
}

您可能希望断言在本例中调用了view.DisplayData方法,因为您没有从该调用中检索任何可由另一个测试断言的内容。

至于“从存储库获取”--你的客户当然关心这一点。他们希望系统将电影保存到存储中,并从存储中加载它们。然而..。FindMovies调用是被测试类的一个输入,所以根本不需要进行这种判断或测试。如果未调用FindMovies方法,则其他测试将失败,并通知您存在问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2332259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档