XUnit 模拟一个方法但没有 return 预期结果

XUnit mocking a method but doesn't return expected result

我在 XUnit 测试中使用最小起订量,但由于某种原因模拟无法正常工作。这是我的单元测试:

 [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 变量为空,而它应该是 return "a sample string" .有人知道为什么吗?

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);
}

}