c# - XUnit 模拟方法但不返回预期结果
问题描述
我在 XUnit 测试中使用 moq,但由于某种原因,模拟无法正常工作。这是我的单元测试:
[Fact]
public async Task SampleUnitTest()
{
//Arrange
var httpClient = new HttpClient(new FakeHttpMessageHandler());
_mockConstructRequest.Setup(x => x.ConstructRequestString(searchRequestModel))
.Returns("a sample string");
var service = new LibraryService(_mockConstructRequest.Object);
//Act
var response = service.GetResponse(new Request(), httpClient);
//Assert
response.Should().BeNull();
}
private class FakeHttpMessageHandler : HttpMessageHandler
{
public Func<HttpRequestMessage, CancellationToken, HttpResponseMessage> HttpRequestHandler { get; set; } =
(r, c) =>
new HttpResponseMessage
{
ReasonPhrase = r.RequestUri.AbsoluteUri,
StatusCode = HttpStatusCode.OK
};
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return Task.FromResult(HttpRequestHandler(request, cancellationToken));
}
}
这是实际的代码,我正在尝试测试GetResponse
方法。
public class LibraryService : ILibraryService
{
private IConfiguration _configuration;
private IRequestConstructor _requestContructor;
public LibraryService (IRequestConstructor requestConstructor)
{
_requestConstructor = requestConstructor;
}
public async Task<Response> GetResponse(Request request, HttpClient client)
{
//construct request
string requestString = _constructRequestString.ConstructRequestString(request, client);
return null;
}
}
public class RequestContructor : IRequestContructor
{
public string ConstructRequestString(Request request)
{
return "a request string";
}
}
我试图从我的单元测试中单步执行代码,但是当断点位于这一行时,requestString
变量为空,而它应该返回“示例字符串”。有谁知道为什么?
string requestString = _constructRequestString.ConstructRequestString(request, client);
解决方案
据我所见,您的模拟不正确:您的模拟:
_mockConstructRequest.Setup(x => x.ConstructRequestString(searchRequestModel))
.Returns("a sample string");
您正在调用的方法:
_constructRequestString.ConstructRequestString(request, client);
不应该是这样的:
_mockConstructRequest.Setup(x => x.ConstructRequestString(It.IsAny<Request>(),It.IsAny<HttpClient>()))
.Returns("a sample string");
最重要的是:
尝试在构造函数中而不是在每个测试中初始化你的模拟和你的“classUnderTest”,它会在每次测试前运行并为你做所有事情。例如:
public class UnitTestClass{
private readonly ClassUnderTest _classUnderTest;
private readonly Mock<ClassUnderTestDependecy> mockedInstance;
public UnitTestClass {
mockedInstance= new Mock<ClassUnderTestDependecy>();
_classUnderTest= new ClassUnderTest (ClassUnderTestDependecy.Object);
}
}
推荐阅读
- sed - csh:设置:不匹配
- angular - 从代码触发表单控件上的(更改)事件
- javascript - 如何在多个类jquery中使用'this'
- airflow - 如何在 Airflow 上重新启动失败的任务并保留失败记录?
- android - 为什么 Observable.create() 在单击时不起作用?
- java - 使用 ArrayList 存储对象并使用 main 方法进行测试
- html - 使用 node.js 将表转换为 JSON
- c# - 如何在 .NET 中将 python 代码用作模块或包
- javascript - Webpack 4 mini-css-extract-plugin 错误:您可能需要适当的加载程序来处理此文件类型
- swift - XCUITest:尝试单击文本字段时失败(线程 1:EXC_BAD_ACCESS (code=1, address=0x0))