Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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#_Asp.net Mvc_Unit Testing_Nunit - Fatal编程技术网

C# 单元测试,检查调用服务层的操作方法

C# 单元测试,检查调用服务层的操作方法,c#,asp.net-mvc,unit-testing,nunit,C#,Asp.net Mvc,Unit Testing,Nunit,我有一个名为NewsController的控制器,该控制器的构造函数接收一个INewsService作为参数 我在这个控制器中有一个名为GetAllNews()的方法,它返回一个JSON结果,我用它来填充YUI数据表。我想编写一个单元测试,检查是否调用了新闻服务的FindAll方法来返回所有新闻项。我该怎么做?我目前拥有的是: public JsonResult GetAllNews() { var items = newsService.FindAll(); var jsonRes

我有一个名为NewsController的控制器,该控制器的构造函数接收一个INewsService作为参数

我在这个控制器中有一个名为GetAllNews()的方法,它返回一个JSON结果,我用它来填充YUI数据表。我想编写一个单元测试,检查是否调用了新闻服务的FindAll方法来返回所有新闻项。我该怎么做?我目前拥有的是:

public JsonResult GetAllNews()
{
   var items = newsService.FindAll();
   var jsonResult = Json(items);

   return jsonResult;
}
我对控制器的单元测试如下所示:

public NewsControllerTest()
{
   newsServiceStub = MockRepository.GenerateStub<INewsService>();
   newsController = new NewsController(newsServiceStub);
}

[Test]
public void GetAllNews_should_use_news_service()
{
   // Arrange
   List<News> newsList = new List<News>();
   newsServiceStub.Stub(s => s.FindAll()).Return(newsList);

   // Act
   var actual = newsController.GetAllNews();

   // Assert
   newsServiceStub.VerifyAllExpectations();
}

如果您可以侥幸逃脱,就不要单元测试是否调用了特定的方法。单元测试的目的是测试行为,而不是实现。测试调用
FindAll
就是测试一个实现。这会导致脆弱的测试,如果您更改了实现,但行为没有更改,测试就会中断。客户不在乎你如何让他们知道所有的新闻,他们只希望你让他们知道所有的新闻

所以

应该是

public void GetAllNews_should_get_all_the_news

我将把编码的细节留给您来决定。

如果您可以侥幸逃脱,请不要对调用的特定方法进行单元测试。单元测试的目的是测试行为,而不是实现。测试调用
FindAll
就是测试一个实现。这会导致脆弱的测试,如果您更改了实现,但行为没有更改,测试就会中断。客户不在乎你如何让他们知道所有的新闻,他们只希望你让他们知道所有的新闻

所以

应该是

public void GetAllNews_should_get_all_the_news

我将把编码的细节留给您。

正如其他人所指出的,从长远来看,测试特定的方法调用可能很脆弱


然而,从Rhino.Mocks的角度来看,如果您想检查期望值,应该使用Mock而不是存根。将您的
GenerateStub
更改为
GenerateMock
,将您的
.Stub()
调用更改为
.Expect()
调用。这将修复您的测试。

正如其他人所指出的,从长远来看,对特定方法调用的测试可能很脆弱


然而,从Rhino.Mocks的角度来看,如果您想检查期望值,应该使用Mock而不是存根。将您的
GenerateStub
更改为
GenerateMock
,将您的
.Stub()
调用更改为
.Expect()
调用。这将修复您的测试。

您可能会发现Martin Fowler的这篇文章对mock和stub之间的差异很感兴趣


Fowler指出存根用于状态验证,而mock用于行为验证

您可能会发现Martin Fowler的这篇关于mock和stub之间差异的文章很有趣


Fowler指出存根用于状态验证,而mock用于行为验证public void GetAllNews_should_get_all_the_news