我有一个类、一个服务和两个接口(interface):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")) 也是如此。我有一个固定装置,如下所示:[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()方法)...测试通过就好了。那么,我假设传入的参数有问题。我在期望缓存提供程序方法被调用的地方做错了什么,但它在匿名方法被传入时窒息? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 问题是这两个匿名方法(Expect 中的一个和 GetByName 中创建的一个是两个不同的对象,因此不相等。您可以通过部分匹配这样的参数来解决这个问题:cacheProvider.Expect(p => p.Get<MyBasicObject>(Arg<string>.Is.Equal("AnUniqueName"), Arg <Func<MyBasicObject>>.Is.NotNull));关于c# - 使用参数中的匿名函数验证函数调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18219256/ (adsbygoogle = window.adsbygoogle || []).push({});
10-10 08:17