gpt4 book ai didi

c# - 在使用 Moq 和 AutoFixture 对 API 进行单元测试时模拟 HttpResponseMessage

转载 作者:太空狗 更新时间:2023-10-29 22:30:08 25 4
gpt4 key购买 nike

我正在为现有的 Web API 2 项目编写单元测试。为此,我正在使用 Ploeh AutofixtureMoq

测试方法: 已更新

 [Test]
public async Task Service1_TestMethod() {

//some code here
var fakeemail = FakeBuilder.Create<string>("test1234@test.com");
var fakeUserInvite =
FakeBuilder.Build<UserInvite>()
.With(i => i.EmailAddress, fakeemail)
.With(i => i.Username, fakeemail)
.Create();
var fakeUserToken = FakeBuilder.Create<string>();
var fakeHttpResponseMessage =
Fixture.Build<HttpResponseMessage>()
.With(h => h.StatusCode, HttpStatusCode.OK).Create();
//Here i am mocking another service method. Whose response is HttpResponseMessage.
Service2.Setup(i => i.AddUser(fakeUserInvite, fakeUserToken))
.ReturnsAsync(fakeHttpResponseMessage);

var result = await Service1.AddUser( /* */);

}

服务 1 方法:

   public async Task<bool> AddUser(/*   */)
{
var response = await Service2.AddUser(userInvite, userToken); // response is null even after mocking it.

// Add user code follows bassed on the above response.

}

如果我评论 Service2.AddUser 调用,那么一切正常。除了这个调用之外,该方法中还有很多代码。我只有这个电话有问题。如果此调用返回模拟的 HttpResponseMessage,则一切正常。

Service2 是一个外部 API。我只是想知道如何模拟 HttpResponseMessage。感谢您的帮助。

最佳答案

您创建的 stub :

service2.Setup(i => i.AddUser(fakeUserInvite, fakeUserToken))
.ReturnsAsync(fakeHttpResponseMessage);

需要使用与 fakeUserInvitefakeUserToken 引用的对象完全相同的对象进行实际调用,以便 Moq 返回fakeHttpResponseMessage.

这是因为Moq's argument matching验证 stub 中指定的参数是否与实际调用中的参数相等。如果它们不匹配, stub 将不匹配,Moq 将返回方法返回类型的默认值——在本例中为 null,因为 HttpResponseMessage 是引用类型。

要解决此问题,您可以确保将 fakeUserInvitefakeUserToken 引用传递给实际的 service2.AddUser 调用或者您可以使用不太具体的 argument constraints .

这是一个例子:

service2.Setup(i => i.AddUser(
It.Is<UserInvite>(u => u.EmailAddress == fakeEmail &&
u.Username == fakeEmail),
fakeUserToken))
.ReturnsAsync(fakeHttpResponseMessage);

这里我们声明 AddUser 方法应该被调用:

  1. 一个 UserInvite 对象,其 EmailAddressUsername 属性与作为第一个参数的 fakeEmail 具有相同的值
  2. 与作为第二个参数的 fakeUserToken 相同的值

如果这些参数的实际值对您的特定测试场景无关紧要,您可以告诉 Moq 始终返回 fakeHttpResponseMessage 而不管 AddUser 参数是什么 被调用时说:

service2.Setup(i => i.AddUser(
It.IsAny<UserInvite>(),
It.IsAny<string>()))
.ReturnsAsync(fakeHttpResponseMessage);

关于c# - 在使用 Moq 和 AutoFixture 对 API 进行单元测试时模拟 HttpResponseMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39015694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com