模拟图书馆方法

时间:2015-06-23 08:18:31

标签: c# unit-testing mocking moq

我最近开始了tdd,但我的嘲弄知识不完整。我知道基础但是,测试一些不考虑tdd的方法,真的让我感到困惑。

以下是我要测试的内容

public int GetThirdPartyUserId(int serviceTypeId, string accessToken)
{
     ThirdPartyRequestDetail requestDetail = GetThirdPartyRequestDetails(serviceType, accessToken);

     IHttwrapConfiguration configuration = new HttwrapConfiguration(requestDetail.BaseUrl);
     IHttwrapClient httwrap = new HttwrapClient(configuration);

     Task<IHttwrapResponse<OpenAuthUserResponse>> response = httwrap.GetAsync<OpenAuthUserResponse>(requestDetail.PathAndQuery);

      try
      {
          if (response.Result.Data != null && response.Status != TaskStatus.Faulted)
          {
              //Do something
          }
          else
          {
              //WANT TO TEST HERE
          }
      }

}

这是我的测试方法

private Mock<IHttwrapClient> _httpwrap;
public void httprwapTest()
{
    string accessToken = "invalid";
    int thirdPartySiteId = (int)ThirdPartyServiceType.GooglePlus;
    string requestPath = _fixture.Create<string>();

    _httpwrap.Setup(item => item.GetAsync(requestPath)).Returns(Task.FromResult(new HttwrapResponse(HttpStatusCode.BadRequest, "body")));            
    OpenAuthUserResponse response = _oauthAuthenticator.GetThirdPartyUser(thirdPartySiteId, accessToken);

    Assert.AreEqual(response.Error, OauthAuthenticatorErrorType.RequestFaulted);

        }

我尝试做的是在下面,但它没有被触发。

_httpwrap.Setup(item => item.GetAsync(requestPath)).Returns(Task.FromResult(new HttwrapResponse(HttpStatusCode.BadRequest, "body")));

当httpwrap给我一个badrequest响应代码时,我如何测试我的类行为?

1 个答案:

答案 0 :(得分:1)

在目前的形式中,您无法使用传统的模拟框架来帮助您进行测试。为了让Mocking正常工作,您必须Setup在生产代码中使用相同的模拟。目前,您在测试中创建的模拟与您测试的方法所依赖的IHttpwrapClient之间没有任何关联。

您需要做的第一步是将HttpwrapClient的创建移到您要测试的方法之外。然后,您需要通过它的界面将其提供给代码,以便您以后可以通过测试提供代码。

提供界面有三种常用方法。

  • 将其注入您班级的构造函数
  • 通过您班级的财产注入
  • 将其作为参数传递给函数

一般来说构造函数注入比属性注入更受欢迎,但它在很大程度上取决于哪种方法最有效(它们各自都有正面和负面)以及对于您的数据最有意义的是什么。重新注射。

然后,您将创建界面的模拟并将其注入您的代码中。

就您的生产代码而言,您仍然需要创建具体类的实例。您可以在调用类时直接执行此操作,也可以通过工厂之类的工作,或使用IoC容器(如Castle Winsor或Ninject(还有其他几个))来直接执行此操作。