And*_*ers 4 c# generics nsubstitute
我在接口中有以下方法签名:
public interface ISettingsUtil
{
T GetConfig<T>(string setting, dynamic settings);
}
Run Code Online (Sandbox Code Playgroud)
我试图嘲笑:
var settingsUtil = Substitute.For<ISettingsUtil>();
var maxImageSize = settingsUtil.GetConfig<long>("maxImageSize",
Arg.Any<dynamic>()).Returns(100L);
Run Code Online (Sandbox Code Playgroud)
这会Microsoft.CSharp.RuntimeBinder.RuntimeBinderException在第二行引发异常:
'long'不包含'Returns'的定义
有关如何T GetConfig<T>(string setting, dynamic settings)正确模拟的任何想法?
小智 5
对于仍在努力解决这个问题的人来说,你实际上可以在NSubsitute中模拟动态,它只需要跳过一些小箍.请参阅以下模拟调用signalR客户端集线器的情况.
重要的是这一行:
SubstituteExtensions.Returns(_hubContext.Clients.All, _mockClient);
Run Code Online (Sandbox Code Playgroud)
为了模拟动态我已经创建了一个我想要监听的方法的接口.然后,您需要使用SubstituteExtensions.Returns而不是简单地在对象的末尾链接.Returns.
如果您不需要验证任何内容,也可以使用匿名对象.
完整代码示例如下:
[TestFixture]
public class FooHubFixture
{
private IConnectionManager _connectionManager;
private IHubContext _hubContext;
private IMockClient _mockClient;
[SetUp]
public void SetUp()
{
_hubContext = Substitute.For<IHubContext>();
_connectionManager = Substitute.For<IConnectionManager>();
_connectionManager.GetHubContext<FooHub>().Returns(_hubContext);
_mockClient = Substitute.For<IMockClient>();
SubstituteExtensions.Returns(_hubContext.Clients.All, _mockClient);
}
[Test]
public void PushFooUpdateToHub_CallsUpdateFooOnHubClients()
{
var fooDto = new FooDto();
var hub = new FooHub(_connectionManager);
hub.PushFooUpdateToHub(fooDto);
_mockClient.Received().updateFoo(fooDto);
}
public interface IMockClient
{
void updateFoo(object val);
}
}
public class FooHub : Hub
{
private readonly IConnectionManager _connectionManager;
public FooHub(IConnectionManager connectionManager)
{
_connectionManager = connectionManager;
}
public void PushFooUpdateToHub(FooDto fooDto)
{
var context = _connectionManager.GetHubContext<FooHub>();
context.Clients.All.updateFoo(fooDto);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4669 次 |
| 最近记录: |