为什么要使用Rhino Mock Stub方法?

时间:2013-01-28 21:54:07

标签: c# rhino-mocks

我刚开始使用Rhino mock为我的项目设置测试用例。 .Return(objToReturn:list)到底有什么作用?

如果我初始化并填充列表然后将其传递给模拟存根方法,它似乎只能工作。我假设我可以使用Mock Stub方法填充列表然后返回填充列表。

....
    private ProductRepository _productRepository;
    private IProductRepository _productRepositoryStub;

    [SetUp]
    public void SetUp()
    {
        _productRepository = new ProductRepository();


        //Testing using Rhino Mocks
        //Generate stub
         _productRepositoryStub = MockRepository.GenerateMock<IProductRepository>();
    }

    [Test]
    public void Canquerydb()
    {
        IList list = _productRepository.GetAllProducts();
        _productRepository.Stub(x=> x.GetAllProducts()).Return(list);
        _productRepositoryStub.AssertWasCalled(x => x.GetAllProducts());
    }


    /// <summary>
    /// Refaactor and use MockRhino here
    /// </summary>
    [Test]
    public void can_insert_product()
    {
        IProduct product = new Grains("Cheese Bread", "Dairy grain", 0);
        _productRepository.SaveProduct(product);
        _productRepositoryStub.Stub(x=>x.SaveProduct(product));
        _productRepositoryStub.AssertWasCalled(x => x.SaveProduct(product));

    }

1 个答案:

答案 0 :(得分:4)

回答你问题的标题:犀牛嘲笑区分Mocks和Stubs。模拟是唯一可以使测试失败的因素,因为它是您正在测试的事物的包装实例 - 您的系统测试(SUT)。你在Rhino模拟中“存根”某些内容,以便你可以满足被模拟对象的依赖关系。存根使您可以看到传递给它的参数,并使您可以控制返回结果,以便您可以完全隔离模拟Mock行为的断言。

此网站还有explanation of Mocks and Stubs

要添加,像Moq这样的库不区分Mocks和Stubs。通过使用泛型,您不必模拟您的SUT。我个人更喜欢Moq的这种简单。