使用Moq

时间:2016-02-23 23:13:02

标签: c# .net unit-testing generics moq

我正在尝试在类中模拟泛型方法。我是Moq的新手,我无法找到模仿方法的正确方法。

我需要测试和模拟的代码。

public class WebServicesManager
{
    public static void Function1<TClient>()
        where TClient : SoapHttpClientProtocol, new()
    {
       //code
    }
}

泛型方法Function1接受泛型类型,它继承自SoapHttpClientProtocol,它基本上是传统asmx Web服务的代理。

为了测试上面的方法,我试图模拟泛型类型参数TClient。但我需要正确的方法来执行此操作,我尝试了以下代码,但我无法找到正确的代码。

    [TestMethod]
    public void Function1Test()
    {
        var mockService = new Mock<SoapHttpClientProtocol>();
        WebServicesManager.Function1<????>();
    }

我想到的一种方法是使用继承自FakeClass的{​​{1}},然后使用Fake类调用泛型方法。

另外,我已经阅读了其他答案here,其中大多数建议使用接口,这是正确的但在我的情况下,因为代理代码是自动生成的(客户端代理代码),所以我有我不能使用接口的限制。

我是否可以模拟类SoapHttpClientProtocol并将其作为通用参数传递?

1 个答案:

答案 0 :(得分:1)

  

我想到的一种方法是使用从SoapHttpClientProtocol继承的FakeClass,然后使用Fake类调用通用方法。

     

是否可以模拟SoapHttpClientProtocol类并将其作为通用参数传递?

是的,如果您将模拟包装在FakeClass中。

PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 
Duplicate entry '813' for key 'PRIMARY': INSERT INTO {gmap_taxonomy_node} 
(nid, tid, marker) VALUES (:db_insert_placeholder_0, 
:db_insert_placeholder_1, :db_insert_placeholder_2); Array ( 
[:db_insert_placeholder_0] => 813 [:db_insert_placeholder_1] => 812 
[:db_insert_placeholder_2] => Other ) in gmap_taxonomy_node_update()(line 
217 of /var/www/most/public/sites/all/modules/gmap/gmap_taxonomy.module).