ReturnResultがカスタムオブジェクトの場合、モックはnull値を返しますが、プリミティブ型のブール値の場合は期待どおりに機能します

Walaitki

私は.netcore(1.1)でMoqを使用しており、interwebのすべての例がこれが問題なく機能するはずであるという事実を示しているため、この動作を理解するのに少し苦労しています。

私はすでに試しました:

  • 戻り値(Task.FromResult(...)
  • 戻り値(Task.FromResult(...)
  • ReturnsAsync(...)

モックIHttpClienラップにTインターフェイスをPostAsyncPutAsyncGetAsyncこれらはすべてApiResponseオブジェクトを返します。

var mockClient = new Mock<IHttpClient>();

動作しません

mockClient.Setup(x => x.PostAsync(url, JsonConvert.SerializeObject(body), null))
                                    .Returns(Task.FromResult(new ApiResponse()));

PostSyncの定義

public async Task<ApiResponse> PostAsync(string url, string body, string authToken = null)

動作します

mockClient.Setup(x => x.PostAsync(url, JsonConvert.SerializeObject(body), null))
                                     .Returns(Task.FromResult(bool));

PostSyncの定義

public async Task<bool> PostAsync(string url, string body, string authToken = null)

使用法:

var api = new ApiService(mockClient.Object);
var response = api.LoginAsync(body.Username, body.Password);

更新

[Fact]
public async void TestLogin()
{
   var mockClient = new Mock<IHttpClient>();
   mockClient.Setup(x => x.PostAsync(url, JsonConvert.SerializeObject(body), null)).Returns(Task.FromResult(new ApiResponse()));

   var api = new ApiService(mockClient.Object);
   var response = await api.LoginAsync(body.Username, body.Password);
   Assert.IsTrue(response);
}

戻り値の型:

public class ApiResponse
{
     public string Content { get; set; }

     public HttpStatusCode StatusCode { get; set; }

     public string Reason { get; set; }
}

LoginAsync:

public async Task<bool> LoginAsync(string user, string password)
{
    var body = new { Username = user, Password = password };
    try
    {
        var response = await _http.PostAsync(_login_url, JsonConvert.SerializeObject(body), null);
        return response .State == 1;
    }
    catch (Exception ex)
    {
        Logger.Error(ex);
        return false;
    }
 }

PostAsync:

public async Task<object> PostAsync(string url, string body, string authToken = null)
{
    var client = new HttpClient();
    var content = new StringContent(body, Encoding.UTF8, "application/json");
    var response = await client.PostAsync(new Uri(url), content);
    var resp = await response.Result.Content.ReadAsStringAsync();
    return new ApiResponse
    {
        Content = resp,
        StatusCode = response.Result.StatusCode,
        Reason = response.Result.ReasonPhrase
    };
}
Nkosi

上記の最小限の例に基づいて、このようなテスト中の単純な方法を想定します。

public class ApiService {
    private IHttpClient _http;
    private string _login_url;

    public ApiService(IHttpClient httpClient) {
        this._http = httpClient;
    }

    public async Task<bool> LoginAsync(string user, string password) {
        var body = new { Username = user, Password = password };
        try {
            var response = await _http.PostAsync(_login_url, JsonConvert.SerializeObject(body), null);
            return response.StatusCode == HttpStatusCode.OK;
        } catch (Exception ex) {
            //Logger.Error(ex);
            return false;
        }
    }
}

次のテストは、正しく構成されている場合に機能します

[Fact]
public async Task Login_Should_Return_True() { //<-- note the Task and not void
    //Arrange
    var mockClient = new Mock<IHttpClient>();
    mockClient
        .Setup(x => x.PostAsync(It.IsAny<string>(), It.IsAny<string>(), null))
        .ReturnsAsync(new ApiResponse() { StatusCode = HttpStatusCode.OK });

    var api = new ApiService(mockClient.Object);

    //Act
    var response = await api.LoginAsync("", "");

    //Assert
    Assert.IsTrue(response);
}

上記は、テストが適切に構成され、予想される動作に基づいて実行された場合に機能することを示すためだけのものです。

フレームワークの使用方法をよりよく理解するために、時間をかけてMoqクイックスタート確認してください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ