Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NSubstitute模拟泛型方法_C#_Generics_Nsubstitute - Fatal编程技术网

C# NSubstitute模拟泛型方法

C# NSubstitute模拟泛型方法,c#,generics,nsubstitute,C#,Generics,Nsubstitute,我在接口中有以下方法签名: public interface ISettingsUtil { T GetConfig<T>(string setting, dynamic settings); } 公共接口设置sutil { T GetConfig(字符串设置、动态设置); } 我曾试图嘲弄: var settingsUtil = Substitute.For<ISettingsUtil>(); var maxImageSize = settingsUtil.

我在接口中有以下方法签名:

public interface ISettingsUtil
{
    T GetConfig<T>(string setting, dynamic settings);
}
公共接口设置sutil
{
T GetConfig(字符串设置、动态设置);
}
我曾试图嘲弄:

var settingsUtil = Substitute.For<ISettingsUtil>();
var maxImageSize = settingsUtil.GetConfig<long>("maxImageSize", 
                                              Arg.Any<dynamic>()).Returns(100L);
var settingsUtil=Substitute.For();
var maxImageSize=settingsUtil.GetConfig(“maxImageSize”,
Arg.Any())。返回(100L);
这会在第2行抛出一个
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
异常:

“long”不包含“Returns”的定义


关于如何正确模拟
T GetConfig(字符串设置、动态设置)
的任何想法?

NSubstitute不适用于使用
dynamic
的成员。()

对于仍在挣扎的任何人来说,你实际上可以在nsubsite中模拟动态,它只需要跳过一些小圈圈。 请参阅下面模拟调用signalR客户端集线器的案例

重要的一点是:

SubstituteExtensions.Returns(_hubContext.Clients.All, _mockClient);
为了模拟动态,我创建了一个带有我想要监听的方法的接口。然后需要使用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);
        }
    }
[TestFixture]
公开课
{
专用i连接管理器(u connectionManager);
私有IHubContext hubContext;
私人IMockClient(mockClient);;
[设置]
公共作废设置()
{
_hubContext=替换为();
_connectionManager=替换.For();
_connectionManager.GetHubContext()返回(_hubContext);
_mockClient=Substitute.For();
SubstituteExtensions.Returns(_hubContext.Clients.All,_mockClient);
}
[测试]
public void pushfoodupdatetohub_callsupdatefoooonhubclients()
{
var fooDto=新fooDto();
var hub=新的FooHub(_connectionManager);
hub.pushfoodupdatetohub(fooDto);
_mockClient.Received().updateFoo(fooDto);
}
公共接口IMockClient
{
void updatefo(object val);
}
}
公共类FooHub:Hub
{
专用只读IConnectionManager\u connectionManager;
公共FooHub(IConnectionManager连接管理器)
{
_connectionManager=connectionManager;
}
公共无效PushFoodUpdateToHub(FooDto FooDto)
{
var context=_connectionManager.GetHubContext();
context.Clients.All.updateFoo(fooDto);
}
}

太糟糕了,NSubstitute正迅速成为我的最爱-希望问题很快得到解决!谢谢你,布雷特,这正是我的问题,我想我爱你!:)你知道如何使用static
Returns
方法来存根一个返回动态类型而不是属性的方法吗?这似乎不再有效了。使用时:
SubstituteExtensions.Returns(\u hubContext.Clients.All,\u mockClient)在运行时,我收到一个错误,表示它无法判断我调用的是以ObjectProxy还是Task作为第一个参数的版本。