gpt4 book ai didi

c# - 模拟副作用

转载 作者:行者123 更新时间:2023-11-30 22:28:08 26 4
gpt4 key购买 nike

使用 Moq,是否可以设置模拟属性以使其发生变异?

例如,给定:

public interface IService // To be mocked.
{
bool IsConnected { get; }
}

是否可以设置 IService 的模拟,以便以下通过?

var mockService = new Mock<IService>();

// Setup mockService so IsConnected mutates...?

bool before = mockService.Object.IsConnected;

bool after = mockService.Object.IsConnected;

Assert.AreNotEqual(before, after);

当然,这种设置并不能解决问题:

mockService.SetupGet(service => service.IsConnected).Returns(false);
mockService.SetupGet(service => service.IsConnected).Returns(true);

这与我的理解是一致的,即 Moq 没有实现记录/回放模型。

这是一个更现实的例子:

public interface IService // To be mocked.
{
bool IsConnected { get; }

void Connect(); // Mutates IsConnected.
}

class Client // To be tested
{
private readonly IService service;

public Client(IService service)
{
this.service = service;
}

public bool DoWork()
{
if (!service.IsConnected) // In test, IsConnected should return false.
{
service.Connect();
}

if (!service.IsConnected) // In test, IsConnected should return true.
{
return false;
}

// ... yada yada yada more code

return true;
}
}

我使用的是 Moq 4.0.10827.0。

最佳答案

您可以将返回设置为 Func<bool>而不是 bool 值。然后您将编写该 func 以更改其结果。像....

bool isConnected = false
var mockService = new Mock<IService>();
// Setup mockService so IsConnected mutates...?
mockService.Setup(s => s.Connect()).Callback(() => isConnected = true);
mockService.SetupGet(s => s.IsConnected).Returns(() => isConnected);

bool before = mockService.Object.IsConnected;

mockService.Object.Connect();

bool after = mockService.Object.IsConnected;

Assert.AreNotEqual(before, after);

但是,根据您的服务变得多么复杂,您可能需要考虑制作 FakeService 并使用它而不是模拟。

关于c# - 模拟副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10931930/

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