gpt4 book ai didi

c# - 使用 FakeItEasy 伪造单例

转载 作者:行者123 更新时间:2023-11-30 15:58:42 28 4
gpt4 key购买 nike

我在测试单例时遇到了一些问题。当我运行这段代码时,我在 TestGetLogicalDevices() 中遇到错误。 CallTo() 失败,因为服务不是假对象。当我尝试创建一个假对象(注释代码)时,它给出了一个错误,因为 RestService 是一个具有私有(private)构造函数的单例。我怎样才能创建这个单例的假对象?

    private RestService service;

[TestInitialize]
public void Init()
{
//service = A.Fake<RestService>();
service = RestService.Instance;
service.CreateClient("test", "test");
}

[TestMethod]
public async Task TestGetLogicalDevices()
{
var logicalDevices = (List<LogicalDevice>)A.CollectionOfFake<LogicalDevice>(10);
A.CallTo(() => service.GetLogicalDevices()).Returns(Task.FromResult(logicalDevices));
List<LogicalDevice> collectedData = await service.GetLogicalDevices();
Assert.AreEqual(2, collectedData.Count);
}

public async Task<List<LogicalDevice>> GetLogicalDevices()
{
var response = await client.GetAsync(apiBaseUrl + "/logical-devices");
if (response.IsSuccessStatusCode)
{
var json = await response.Content.ReadAsStringAsync();
var logicalDevices = JsonConvert.DeserializeObject<List<LogicalDevice>>(json);
var sortedList = logicalDevices.OrderBy(logicalDevice => logicalDevice.Name).ToList();
return sortedList;
}
else
{
return null;
}
}

更新我添加了我要测试的方法的代码。也许有人对更好的测试有建议?

最佳答案

注意:我不确定我是否理解您要执行的操作。你到底想测试什么?在你的测试中,你配置 service.GetLogicalDevices() 返回一些东西,然后你调用 service.GetLogicalDevices() 并断言它返回什么(除非 FakeItEasy 被破坏,应该是你配置它返回的)。所以,您实际上并没有在测试服务……您是在测试模拟框架!像 FakeItEasy 这样的模拟框架可用于模拟被测系统 (SUT) 的依赖项,而不是 SUT 本身。在您的情况下,如果 SUT 是 RestService,则您需要模拟 RestService 的依赖项,而不是 RestService 本身。例如,您可以使用您控制的 HttpMessageHandler 注入(inject) HttpClient(有关详细信息,请参阅 here)。


现在,回答您的实际问题(假设您想要伪造的确实是 RestService):

When I run this code, I get an error in TestGetLogicalDevices(). CallTo() failed because service is no fake object.

A.CallTo 仅适用于假货; FakeItEasy 无法控制不是它创建的对象的行为。

When I try to create a fake object (commented code), it gives an error because RestService is a singleton with private constructor

RestService 是一个类,FakeItEasy 可以为类创建一个假的,但是它是通过继承类来实现的,所以它需要一个可访问的构造函数。另外,请记住只能配置虚拟 方法。 GetLogicalDevices 不是虚拟的,所以假的不能覆盖它的行为。

伪造 RestService 有两个主要选项:

  • 将构造函数设置为protected 而不是private,并将方法设置为虚拟的以便可以覆盖
  • 创建一个代表 RestService 类的“公共(public)契约”的 IRestService 接口(interface),并伪造该接口(interface)而不是该类。

关于c# - 使用 FakeItEasy 伪造单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42748392/

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