Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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# 如何对被测类引发的事件进行单元测试?_C#_Unit Testing - Fatal编程技术网

C# 如何对被测类引发的事件进行单元测试?

C# 如何对被测类引发的事件进行单元测试?,c#,unit-testing,C#,Unit Testing,我有一个班级,负责根据一些商业条件举办活动 公共类EventRaiserClass:IEventRaiserClass { 公共事件处理程序SendEventToClient; 公共无效提高有效性客户 { SendEventToClient?.Invokethis,EventArgs.Empty; } } 这是我的客户端类 公共类客户端:IClient { EventRaiserClass\u eventRaiser; 公共客户VentraiserClass事件引发者 { _eventRaise

我有一个班级,负责根据一些商业条件举办活动

公共类EventRaiserClass:IEventRaiserClass { 公共事件处理程序SendEventToClient; 公共无效提高有效性客户 { SendEventToClient?.Invokethis,EventArgs.Empty; } } 这是我的客户端类

公共类客户端:IClient { EventRaiserClass\u eventRaiser; 公共客户VentraiserClass事件引发者 { _eventRaise=eventRaise; _iotGwStatus.SendEventToClient+=OnSendEventToClient; } 私有异步无效OnSendEventToClientobject发送方,EventArgs e { 等待发送事件到客户端; } 公共异步任务SendEventToClient { //做些手术 } } EventRaiserClass被注入到负责处理某些订单的下面的类中

公共类ProcessRequest:IPProcessRequest { IEventRaiserClass_evntRaiser; 公共进程RequestieVentraiserClass evntRaiser { _evntRaiser=evntRaiser; } public-void-ProcessJObject-json { _evntRaiser.RaiseEventForClient; } } 现在,我如何对上述过程方法进行单元测试?如何确保调用process方法时引发事件?

据我所知,客户机类与此问题无关?您只需要测试调用ProcessRequest的进程。进程调用EventRaiserClass.RaiseEventForClient

使用EventRaiserClass的简单方法,无需任何模拟:

您可以进一步测试事件是否只引发一次:

// Arrange
var eventRaiser = new EventRaiserClass();
int eventRaisedCount = 0;
eventRaiser.SendEventToClient += (o, e) => eventRaisedCount++;

var processRequest = new ProcessRequest(eventRaiser);

// Act
processRequest.Process(someJObject);

// Assert
Assert.Equal(1, eventRaisedCount);
如果您不想依赖EventRaiserClass,并且使用的是模拟框架,那么可以执行我在本例中使用的类似操作:

// Arrange
var eventRaiser = Mock<IEventRaiser>();
var processRequest = new ProcessRequest(eventRaiser.Object);

// Act
processRequest.Process(someJObject);

// Assert
eventRaiser.Verify(x => x.RaiseEventForClient());
使用相同的方法:

另外,请考虑一下如何命名类。大多数编码标准都说类应该用名词或名词短语命名,而不应该以Class结尾

所以客户端是可以的,但EventRaiserClass以类结尾。考虑一些类似于EnrTraceS.< /P> ProcessRequest不是一个名词或名词短语,它听起来像是一个指令处理这个请求,这通常是你命名一个方法而不是一个类的方式。请考虑像请求处理器这样的对象,它是处理请求的对象。据我所知,客户端类与这个问题无关。您只需要测试调用ProcessRequest的进程。进程调用EventRaiserClass.RaiseEventForClient

使用EventRaiserClass的简单方法,无需任何模拟:

您可以进一步测试事件是否只引发一次:

// Arrange
var eventRaiser = new EventRaiserClass();
int eventRaisedCount = 0;
eventRaiser.SendEventToClient += (o, e) => eventRaisedCount++;

var processRequest = new ProcessRequest(eventRaiser);

// Act
processRequest.Process(someJObject);

// Assert
Assert.Equal(1, eventRaisedCount);
如果您不想依赖EventRaiserClass,并且使用的是模拟框架,那么可以执行我在本例中使用的类似操作:

// Arrange
var eventRaiser = Mock<IEventRaiser>();
var processRequest = new ProcessRequest(eventRaiser.Object);

// Act
processRequest.Process(someJObject);

// Assert
eventRaiser.Verify(x => x.RaiseEventForClient());
使用相同的方法:

另外,请考虑一下如何命名类。大多数编码标准都说类应该用名词或名词短语命名,而不应该以Class结尾

所以客户端是可以的,但EventRaiserClass以类结尾。考虑一些类似于EnrTraceS.< /P>
ProcessRequest不是一个名词或名词短语,它听起来像是一个指令处理这个请求,这通常是你命名一个方法而不是一个类的方式。请考虑像请求处理器这样的对象,它是处理请求的对象。

您也可以检查关于发送器和事件码的抛出事件。 如果您不想编写三个测试方法来测试整个事件引发过程,那么这是适合您的

[测试方法] void TestProcessRaiseEvent{ //安排 var eventRaiser=新的eventRaiser类; var processRequest=新的ProcessRequesteventRaiser; var json=defaultJObject;//创建json Action Action=>processRequest.Processjson; //行动/主张 Test.If.raiseventVentraiser、SendEventToClient、action、out Object sender、out EventArgs e; Test.If.ReferencesEqualeventRaiser,发送方; Test.If.ValuesEquale,EventArgs.Empty; }

您应该考虑单独测试EngReTraceC类和PraseRealpor。

[测试方法] 腹侧间隙{ //安排 var eventRaiser=新的eventRaiser类; Action Action=>eventRaiser.RaiseEventForClient; //行动/主张 Test.If.raiseventVentraiser、SendEventToClient、action、out Object sender、out EventArgs e; Test.If.ReferencesEqualeventRaiser,发送方; Test.If.ValuesEquale,EventArgs.Empty; } [测试方法] void TestProcessRaiseEvent{ //安排 var eventRaiser=新的eventRaiser类; var processRequest=新的ProcessRequesteventRaiser; var json=defaultJObject;//创建json Action Action=>processRequest.Processjson; //行动/主张 Test.If.raiseventVentraiser、SendEventToClient、action、out Object sender、out EventArgs e; }
您可能还需要检查有关发送方和eventArgs的抛出事件。 如果你不想写这些 e测试方法来测试整个事件引发过程,然后是为您准备的

[测试方法] void TestProcessRaiseEvent{ //安排 var eventRaiser=新的eventRaiser类; var processRequest=新的ProcessRequesteventRaiser; var json=defaultJObject;//创建json Action Action=>processRequest.Processjson; //行动/主张 Test.If.raiseventVentraiser、SendEventToClient、action、out Object sender、out EventArgs e; Test.If.ReferencesEqualeventRaiser,发送方; Test.If.ValuesEquale,EventArgs.Empty; }

您应该考虑单独测试EngReTraceC类和PraseRealpor。

[测试方法] 腹侧间隙{ //安排 var eventRaiser=新的eventRaiser类; Action Action=>eventRaiser.RaiseEventForClient; //行动/主张 Test.If.raiseventVentraiser、SendEventToClient、action、out Object sender、out EventArgs e; Test.If.ReferencesEqualeventRaiser,发送方; Test.If.ValuesEquale,EventArgs.Empty; } [测试方法] void TestProcessRaiseEvent{ //安排 var eventRaiser=新的eventRaiser类; var processRequest=新的ProcessRequesteventRaiser; var json=defaultJObject;//创建json Action Action=>processRequest.Processjson; //行动/主张 Test.If.raiseventVentraiser、SendEventToClient、action、out Object sender、out EventArgs e; }
据我所知,您的客户机类与这个问题无关?它在任何地方都没有引用。据我所知,您的客户机类与这个问题无关?它没有在任何地方引用。关于命名约定,是的,我同意。我只是修改了我的生产代码来简化这个问题。太好了,我用NSubstitute来嘲笑你。如何将其更改为NSubstitute?酷,为NSubstitute添加了一个部分。太棒了!你是冠军。让我快速测试并标记答案。我从文档中编写了NSubstitute部分-我自己不使用它。如果它不起作用,我会亲自修复它,我会直接将示例json作为字符串存储在测试夹具类中,或者如果它在多个测试夹具中使用,则存储在测试项目的帮助器类中。尽量不要让它太大——如果可能的话,在不同的测试中使用大量的json小片段要比在许多不同的测试中使用一个大片段要好得多。考虑到命名约定,是的,我同意。我只是修改了我的生产代码来简化这个问题。太好了,我用NSubstitute来嘲笑你。如何将其更改为NSubstitute?酷,为NSubstitute添加了一个部分。太棒了!你是冠军。让我快速测试并标记答案。我从文档中编写了NSubstitute部分-我自己不使用它。如果它不起作用,我会亲自修复它,我会直接将示例json作为字符串存储在测试夹具类中,或者如果它在多个测试夹具中使用,则存储在测试项目的帮助器类中。尽量不要把它弄得太大——如果可能的话,为不同的测试提供大量的json小片段要比在许多不同的测试中使用一个大片段要好得多