犀牛嘲笑泛型问题
本文关键字:问题 泛型 犀牛 | 更新日期: 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
。 存根通常用于接口。 我通常只在模拟实际的班级成员时使用模拟。