假易安装对象未在测试方法中返回

本文关键字:测试方法 返回 对象 易安装 安装 | 更新日期: 2023-09-27 18:35:16

我正在用FakeItEasy假对象测试一种方法。假对象是内存流

[TestFixture]
public class ServerClientTests
{
    private IWebClient webClient;
    private ServerClient serverClient;
    [SetUp]
    public void Setup()
    {
        webClient = A.Fake<IWebClient>();
        serverClient = new ServerClient(webClient);
        var responseStreamBytes = Encoding.Default.GetBytes("OK");
        var responseStream = new MemoryStream();
        responseStream.Write(responseStreamBytes, 0, responseStreamBytes.Length);
        responseStream.Seek(0, SeekOrigin.Begin);
        var response = A.Fake<WebResponse>();
        A.CallTo(() => response.GetResponseStream()).Returns(responseStream);
        var request = A.Fake<WebRequest>();
        A.CallTo(() => request.GetResponse()).Returns(response);
        A.CallTo(() => webClient.GetRequest("http://localhost:8080/myserver")).Returns(request);
    }
        [Test]
        public void Test1()
        {
            var result = serverClient.GetRequest("http://localhost/myserver");
            Assert.AreEqual(2, result.Length);
      }
  }

这是测试中的代码:

public interface IWebClient
{
    WebRequest GetRequest(string url);
}
public class ServerClient
{
    private readonly IWebClient client;
    public ServerClient(IWebClient client)
    {
        this.client = client;
    }
    public Stream GetRequest(string url)
    {
        return client.GetRequest(url).GetResponse().GetResponseStream();
    }
}

当我运行测试时,它给出了测试异常 => 预期:2 但曾经是:0

我将断点放在设置方法和调试测试中。我看到假请求 GetResponse() 方法返回带有流的响应。该长度为 2。

但在测试方法中,流长度为 0。

有关于FakeItEasy的任何设置吗?或者我错在哪里?

假易安装对象未在测试方法中返回

您正在设置

 A.CallTo(() => webClient.GetRequest("http://localhost:8080/myserver"))
                         .Returns(request);

但随后打电话

serverClient.GetRequest("http://localhost/myserver");

因此,webClient.GetRequest被传递"http://localhost/myserver",这不符合其期望("http://localhost8080/myserver"),因此webClient返回自己设计的假MemoryStream,具有默认行为。

您可能希望使两个 URL 相同。或者,如果你想让你的假webClient不仅仅响应一个 URL,你可以使用更复杂的参数匹配器。

将来,如果对为什么配置的方法没有按照您想要的方式运行产生这种混淆,您可以考虑暂时使用 Call to MustHaveHappened 来检查 FakeItEasy 是否认为该方法被调用。我们喜欢认为FakeItEasy的错误消息在这种情况下非常擅长帮助。

在您的情况下,如果您添加了类似

[Test]
public void Test2()
{
    var result = serverClient.GetRequest("http://localhost/myserver");
    A.CallTo(() => webClient.GetRequest("http://localhost:8080/myserver"))
        .MustHaveHappened();
}

它会说

Assertion failed for the following call:
  FakeItEasyQuestions.IWebClient.GetRequest("http://localhost:8080/myserver")
Expected to find it at least once but found it #0 times among the calls:
  1: FakeItEasyQuestions.IWebClient.GetRequest(url: "http://localhost/myserver")