Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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# 如何使用NUnit DynamicLock模拟非接口和非MarshalByRef_C#_Sockets_Mocking_Nunit - Fatal编程技术网

C# 如何使用NUnit DynamicLock模拟非接口和非MarshalByRef

C# 如何使用NUnit DynamicLock模拟非接口和非MarshalByRef,c#,sockets,mocking,nunit,C#,Sockets,Mocking,Nunit,我正在写一个用字母缩写的班级。我想使用NUnit DynamicMock编写一个测试 我怎样才能不费吹灰之力就创建一个模拟的呢 DynamicMock DynamicSocketMock = new DynamicMock(typeof (Socket)); /*No ERROR - BUT I THINK HERE IS THE PROBLEM*/ Socket SocketMock = (Socket) DynamicSocketMock.MockInstance; /*RUNTIME

我正在写一个用字母缩写的班级。我想使用NUnit DynamicMock编写一个测试

我怎样才能不费吹灰之力就创建一个模拟的呢

DynamicMock DynamicSocketMock = new DynamicMock(typeof (Socket)); 
/*No ERROR - BUT I THINK HERE IS THE PROBLEM*/

Socket SocketMock = (Socket) DynamicSocketMock.MockInstance;
/*RUNTIME ERROR*/

ToBeTested Actual = new ToBeTested(SocketMock);
/*NEVER REACHED*/
编辑#1

我查看了最低起订量,它看起来很不错,但我仍然无法测试。我最初的问题是找到要使用的rigth版本,但我想我解决了这个问题

var Mock = new Mock<Socket>();
Socket MockSocket = (Socket)Mock.Object;
ToBeTested Actual = new ToBeTested(SocketMock);
var Mock=new Mock();
套接字MockSocket=(Socket)Mock.Object;
ToBeTested实际值=新的ToBeTested(SocketMock);
问题在于套接字没有无参数的构造函数。现在我不想给它一个参数,我想模拟一切

编辑#2
这似乎是一个问题,因为目标是直接从套接字创建一个mock。

我认为mock
socket
是一个相当高级的任务,但DynamicMock不适合这样做,毕竟他们并不假装是一个真正强大的mock解决方案

我个人使用Moq,由于Socket类不是密封的,我认为用Moq模拟它应该非常简单,并且适合您的需要

Nunit DynamicMock并没有很好的文档记录,也没有在internet上很好地表示出来,但我在这里查看了它的构造函数中的代码

看起来除了接口之外,它不应该与任何东西一起工作,所以一旦需要,您就需要研究真正的模拟框架。

我解决了我的问题

答案是只有接口的DynamicMock

Moq仅适用于prosperparameters或,因为我很多时候都想让它变得简单-以下是我所做的:

public class Test_MockSocket : Socket
{
    public Test_MockSocket() : base (
                    (new IPEndPoint(IPAddress.Parse("127.0.0.1"), 30000)).AddressFamily,
                    (SocketType.Stream),
                    (ProtocolType.Tcp))
    {
    }
}
设置测试时:

        var Mock = new Mock<Test_MockSocket>();
        Socket MockSocket = (Socket)Mock.Object;
        ToBeTested Actual = new ToBeTested (MockSocket);
var Mock=new Mock();
套接字MockSocket=(Socket)Mock.Object;
ToBeTested实际值=新ToBeTested(模拟插座);

我认为你不可能比这更省力。

这取决于你下一步想做什么。使用真正的模拟解决方案(如Moq),您可以将模拟配置为在某些调用上返回某些值。但若您只需要将对象传递给构造函数,而不使用它做任何有趣的事情,那个么您总是可以像这里这样手动继承模拟类。