微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 使用参数中的匿名函数验证函数调用

我有一个类,一个服务和两个接口:

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

(也就是说,将IgnoreArguments()方法添加到expect调用的末尾)

……测试通过就好了.我假设,这是传入的参数的一个问题.是否有一些我在调用缓存提供程序方法的期望中做错了但是它会在传入的匿名方法上窒息?

解决方法

问题是两个匿名方法(Expect中的一个和GetByName中创建的一个是两个不同的对象,因此不相等.你可以通过部分匹配这样的参数来解决这个问题:

cacheProvider.Expect(p => p.Get<MyBasicObject>(Arg<string>.Is.Equal("AnUniqueName"),Arg <Func<MyBasicObject>>.Is.NotNull));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐