假易安装对象未在测试方法中返回
本文关键字:测试方法 返回 对象 易安装 安装 | 更新日期: 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")