犀牛嘲笑泛型问题

时间:2011-06-27 13:52:05

标签: c# rhino-mocks

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

 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();中,barfs声明Add没有被调用。

测试类代码 - 伪 -

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

我做错了什么?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这条线似乎很可疑:

testClass.Add; 

参数是否应该传递给此方法?我甚至不知道如何编译这是诚实的。

答案 2 :(得分:0)

使用GenerateStub代替GenerateMock。存根通常用于接口。当我嘲笑实际的班级成员时,我通常只会使用嘲笑。

答案 3 :(得分:0)

这里发生的事情我认为你正在设置对要调用的方法Add的期望,但是这个方法不同于Add,这是你真正调用的方法。

简而言之,要么改变你的预期:

repo.Expect(x => x.Add(Arg<CacheEntity>.Is.Anything));

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

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