犀牛嘲笑泛型问题

本文关键字:问题 泛型 犀牛 | 更新日期: 2023-09-27 18:00:25

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

 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());
    }
}

我做错了什么?

犀牛嘲笑泛型问题

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

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

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

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

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

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

这一行似乎很可疑:

testClass.Add; 

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

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