【问题标题】:Rhino mocks generics issueRhino 模拟泛型问题
【发布时间】:2011-06-27 13:52:04
【问题描述】:

我有一个需要模拟的界面 -

 public interface IRepositoryCachable  
 {
     IEnumerable<T> All<T>() where T : ICacheEntity;
     void Delete<T>(T item) where T : ICacheEntity;
     void Add<T>(T item) where T : ICacheEntity;
     void Update();
     T SingleOrDefault<T>(Func<T, bool> predicate) where T : ICacheEntity;
     IEnumerable<T> Find<T>(Func<T, bool> predicate) where T : ICacheEntity;
 }

这是我的测试 -

var repo = MockRepository.GenerateMock<IRepositoryCachable>();
repo.Expect(x => x.Add(Arg<ICacheEntity>.Is.Anything));

testClass = new testclass(repo);

testClass.Add;

repo.VerifyAllExpectations();

testClass.Add 呼叫repo.Add。但是在 VerifyAllExpectation(); 中,它会声明 Add 未被调用。

测试类的代码 - 伪 -

public class TestClass
{
    public void Add()
    {
         _repo.Add( new CacheEntity());
    }
}

我做错了什么?

【问题讨论】:

    标签: c# rhino-mocks


    【解决方案1】:

    您为什么要测试实现细节(称为什么?)而不是行为(将其添加到数据库中,或者返回缓存的实体,或其他)?

    【讨论】:

    • 您的单元测试中不能有数据库。所以这是通常的做法——你模拟一个存储库,然后使用伦敦学校的单元测试方法,即行为测试,即“所谓的”。 (您似乎使用了“行为”一词,您的意思是基于州的测试(芝加哥学校),这是另一种混淆)。
    【解决方案2】:

    我认为这里发生的事情是您正在为要调用的方法 Add 设置期望,但此方法与 Add 不同,后者是您真正调用的方法。

    简而言之,要么将您的期望更改为:

    repo.Expect(x =&gt; x.Add(Arg&lt;CacheEntity&gt;.Is.Anything));

    或者将您的非测试代码更改为: _repo.Add&lt;ICacheEntity&gt;(new CacheEntity());

    我假设您不想做第二个,因为您在该方法上放置了一个通用参数,而这样做的唯一原因是因为您需要将参数键入具体类型。

    【讨论】:

      【解决方案3】:

      这条线似乎很可疑:

      testClass.Add; 
      

      是否应该向该方法传递参数?老实说,我什至不明白这如何编译。

      【讨论】:

      • 好吧,OP 没有包含任何关于 testClass 的详细信息。如您所知,Add 可能是一个属性。
      • 对不起是 testClass.Add();我已经编辑了我的问题。问题仍然存在!
      • 这是我不知道的语法吗?你可以说“testClass.Add;”没有分配也没有括号?这不会编译,属性与否。
      【解决方案4】:

      使用GenerateStub 而不是GenerateMock。存根通常用于接口。我通常只在模拟实际班级成员时使用模拟。

      【讨论】:

      • 您不应在 Rhinomocks 中将存根与 VerifyAllExpections 结合使用。见:lostechies.com/sharoncichelli/2010/03/19/…
      • 啊,是的,你是对的。我忘记了期望。所以我会使用存根,但不要使用 Expect,而是在运行测试后使用 AssertWasCalled。
      • 这也是我通常采用的方法。我不喜欢VerifyAll。 ://
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多