犀牛嘲笑 - 这个测试看起来合情合理吗?

时间:2009-12-01 16:51:15

标签: unit-testing mocking rhino-mocks

我刚刚使用Rhino模拟制作了以下测试。我的测试看起来是否有效并且对那些有嘲弄经验的人有意义?

我有点困惑,我没有必要使用 DynamicMock() StrictMock()方法来创建看似有效的测试。

此测试测试使用提供的参数在提供的ICachingStrategy上调用Add方法。

    object o = new object();
    DateTime d = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day + 1, 0, 0, 0);
    CacheStorageStyle s = CacheStorageStyle.Unmodified;
    string f = "test";

    //arrange  
    var stubStrategy = MockRepository.GenerateStub<ICachingStrategy>();
    var stubEncoder = MockRepository.GenerateStub<ICacheItemEncoder>();
    stubStrategy.Stub(x => x.Add(o,d,s,f)).Return("test:key");            
    stubEncoder.Stub(x => x.Encode(o,s)).Return(o);

    _mocks.ReplayAll();

    //act
    ICache c = new Cache(stubStrategy, stubEncoder);
    c.Add(o, d, s, f);

    //assert
    stubStrategy.AssertWasCalled(x => x.Add(o,d,s,f)); 

2 个答案:

答案 0 :(得分:4)

问题是:它成功了吗?你期待它吗?如果答案是肯定的,那么测试是好的。您可以通过在实施过程中对Add()的调用进行评估来强制执行测试,从而进一步测试测试。如果未调用Add()方法,则测试应该失败。

Here是解释存根和模拟之间差异的相关文档。根本区别在于存根“永远不会导致测试失败”。他们只是为了使测试代码工作。文档进一步建议,只要有可能,存根应优先于模拟。

您的测试似乎对我有效,因为您主要关注是否调用了Add()方法,并且您明确断言该调用。你没有测试其他的方法调用,所以你要对它们进行存根而不是模拟它们。

答案 1 :(得分:1)

re:Strict vs Dynamic - 另外值得注意的是,在RhinoMocks 3.5中,对MockRepository.GenerateMock()的调用不会产生严格的模拟。

根据您的测试结果,您可能/可能不关心模拟中未调用的内容。