我有一个类,一个服务和两个接口:
我原以为这个测试会通过,但运行之后,断言失败了,并提示我
编辑:
所以如果我这样做:
也就是说,在expect调用的末尾添加IgnoreArguments()方法即可。当我这样做时,测试顺利通过。因此我假设问题出在传入的参数上。在expect中调用缓存提供程序方法时,是否有什么我做错了导致匿名方法无法使用?
public class MyBasicObject
{
public MyBasicObject() { }
public int Id { get; set; }
public string Name { get; set; }
}
public interface ICacheProvider
{
T Get<T>(string key, Func<T> fetcher) where T:class;
}
public interface IMyBasicObjectRepository
{
MyBasicObject GetByName(string name);
}
public class MyBasicObjectService
{
public MyBasicObjectService(ICacheProvider cacheProvider,
IMyBasicObjectRepository repository)
{
CacheProvider = cacheProvider;
MyBasicObjectRepository = repository;
}
public ICacheProvider CacheProvider { get; set; }
public IMyBasicObjectRepository MyBasicObjectRepository { get; set; }
public MyBasicObject GetByName(string name)
{
return CacheProvider.Get<MyBasicObject>(name, () =>
MyBasicObjectRepository.GetByName(name));
}
}
使用RhinoMocks,我希望能够验证当执行MyBasicObjectService.GetByName("AnUniqueName")
时,也会执行CacheProvider.Get("AnUniqueName", () => MyBasicObjectRepository.GetByName("AnUniqueName"))
。我已经设置了一个如下的fixture:
[TestFixture]
public class MyBasicObjectServiceFixture
{
[Test]
public void GetByNameShouldCallCacheProviderFunction()
{
// Arrange
MockRepository mock = new MockRepository();
IMyBasicObjectRepository repo = mock.DynamicMock<IMyBasicObjectRepository>();
ICacheProvider cacheProvider = mock.DynamicMock<ICacheProvider>();
MyBasicObjectService service = new MyBasicObjectService(cacheProvider, repo);
cacheProvider.Expect(p => p.Get<MyBasicObject>("AnUniqueName", () => repo.GetByName("AnUniqueName")));
mock.ReplayAll();
// Act
var result = service.GetByName("AnUniqueName");
// Assert
mock.VerifyAll();
}
}
我原以为这个测试会通过,但运行之后,断言失败了,并提示我
cacheProvider.Expect
中定义的函数未被调用。我是不是在模拟和测试带有Func<>
参数的方法时漏掉了什么?编辑:
所以如果我这样做:
cacheProvider.Expect(p => p.Get<MyBasicObject>("AnUniqueName", () => repo.GetByName("AnUniqueName"))).IgnoreArguments();
也就是说,在expect调用的末尾添加IgnoreArguments()方法即可。当我这样做时,测试顺利通过。因此我假设问题出在传入的参数上。在expect中调用缓存提供程序方法时,是否有什么我做错了导致匿名方法无法使用?