我有一个我需要模拟的界面 -
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());
}
}
我做错了什么?
答案 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());
我假设您不想做第二个,因为您在该方法上放置了一个泛型参数,唯一的原因是因为您需要将参数输入到具体类型。