如何使用NUnit DynamicMock模拟非接口和非MarshalByRef

时间:2011-09-12 21:03:44

标签: c# sockets mocking nunit

我正在编写一个将用Socket初始化的类。我想使用NUnit DynamicMock编写测试。

如何在不费力的情况下创建Socket的模拟?

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

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

var Mock = new Mock<Socket>();
Socket MockSocket = (Socket)Mock.Object;
ToBeTested Actual = new ToBeTested(SocketMock);

问题是Socket没有没有参数的构造函数。现在我不想给它一个参数,我想模仿一切。

编辑#2 这似乎是lot of people的问题。目标是直接从套接字创建模拟。

2 个答案:

答案 0 :(得分:2)

我认为模拟Socket是一个相当高级的任务NUnit DynamicMock不适合它,毕竟他们并没有假装是一个真正强大的模拟解决方案。

我个人使用Moq,由于Socket类没有密封,我认为使用Moq进行模拟应该非常简单,适合您的需求。

Nunit DynamicMock没有很好的文档记录,并且在互联网上有代表,但我在这里看了一下构造函数的代码

http://nunit.sourcearchive.com/documentation/2.5.10.11092plus-pdfsg-1/DynamicMock_8cs_source.html#l00014

看起来不应该使用除接口之外的任何东西,所以你需要在需要时查看真正的模拟框架。

答案 1 :(得分:0)

我解决了我的问题。

答案是使用Interfaces的DynamicMock。

Moq只是与繁荣参数,或者,因为我想要很多次 - 这就是我做的:

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);

我不认为你能用比这更少的努力来获得它。