gpt4 book ai didi

c# - 使用 NSubstitute 模拟 Action

转载 作者:行者123 更新时间:2023-11-30 21:59:24 25 4
gpt4 key购买 nike

Web 服务的代理需要单元测试 - 显然 - 不影响 Web 服务。

这是我想绝育的方法-

public void Invoke(Action<T> action)
{
Task.Run(async ()=> { await _invoker.Invoke(this, action); }).Wait();
}

有什么方法可以使用 NSubstitute 模拟 Action 参数吗?我一直在使用

_proxy.When(x => x.Invoke($args_go_here)).Do(x => _counter++);

但我在制定 Args 表达式时遇到了真正的麻烦。如果我可以简单地创建一个带有 Action 签名的 mock 并将其传入,生活就会简单得多,可读性也更高。

最佳答案

正如 David 的评论(请参阅问题评论),我在这里发布了实际解决了我的问题的内容。

问题是测试调用 WCF 服务的代码是否确实在运行,发送正确的东西等。我强烈建议任何走这条路的人都以 TDD 风格这样做,因为对其他人的工作代码进行改造单元测试这不是一种愉快的体验。

在这种情况下,代理不是自动生成的,而是继承自单个 ProxyBase 类,该类公开了上面引用的 Invoke(Action action) 方法。

public void Invoke(Action<T> action)
{
Task.Run(async ()=> { await _invoker.Invoke(this, action); }).Wait();
}

我的第一个想法是模拟 Action(我最终确实这样做了)但是这产生了 Service Not Found 错误,非常正确。

最终我得到了(特定的)Proxy Invoker 类的 NSubstitute Automock,它是通过实际将依赖项传递到构造函数中创建的,就像这样 -

var myProxyMock = Substitute.For<MyProxy>(dependency1, dependency2);

并将基本调用方法更改为 Virtual 以便替代方法可以覆盖它,就像这样 -

public virtual void Invoke(Action<T> action)
{
Task.Run(async ()=> { await _invoker.Invoke(this, action); }).Wait();
}

现在,通过替换为 Action,我实际上可以有效地测试周围的代码。

var actionSubstitute = Substitute.For<Action<MyService>>();

并应用相关的返回值,natch。

所以最终,我们有 -

myProxyMock.When(x => x.Invoke(Arg.Any<Action<MyService>>).Do(x => _counter++);

问题解决了。非常感谢,大卫。

关于c# - 使用 NSubstitute 模拟 Action<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29300512/

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