如何使用Rhino Mocks进行单元测试和模拟静态扩展方法?

时间:2010-10-04 12:11:06

标签: unit-testing rhino-mocks

我写了以下扩展方法:

 static public IQueryable<OutboundPattern> ByClientID(this IQueryable<OutboundPattern> qry, int clientID)
    {
        return from p in qry
               where p.ClientID == clientID
               select p;
    }

我还编写了以下服务层方法:

    public IList<OutboundPattern> OutboundPatterns(int ClientId) 
    {
        return _outboundpatternRepository.OutboundPatterns().ByClientID(ClientId).ToList();
    }

我很想知道如何用Rhino嘲笑嘲笑?我知道静态方法和Rhino模拟不是很好吗?它无法模拟静态方法。

3 个答案:

答案 0 :(得分:2)

Daniel Cazzulino有几篇博客文章描述了一种模拟静态扩展方法的方法。

  

基本思想是你采用所有的静态扩展方法......并将它们移动到一个易于模拟的接口,并使静态类使用工厂来构造该接口的实例。这个工厂可以由朋友测试组件替换,用于嘲弄目的。

在这种情况下,这可能比你想做的更多的工作/改变,但这是我见过的唯一方法(除了购买TypeMock)。

以下是他的帖子:

Making extension methods amenable to mocking

How to mock extension methods

答案 1 :(得分:1)

我认为你不能模拟扩展方法 - 因为它们是有效的静态方法。在测试方面,您应该将它们更多地视为使用它们的类的一部分而不是它们所定义的类(类似于辅助方法)。因此,我通常使用扩展方法进行一些简单的转换,并避免使用其中的业务逻辑。

答案 2 :(得分:0)

此时受测试的课程是什么?

假设它是OutboundPatterns,那么我会模拟_outboundpatternRepository返回一些东西(可能是一个简单的列表),它只有客户端匹配所请求的ClientId,并且可能在它为空时再次返回。应为扩展方法编写单独的单元测试。

所以回顾一下,我通过让它调用真实的OutboundPatterns来测试ByClientID但是使用严格控制的数据。