Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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
Asp.net mvc 2 带有ASP.NET MVC 2、NUnit和Rhino Mock的TDD控制器_Asp.net Mvc 2_Tdd_Nunit_Rhino Mocks - Fatal编程技术网

Asp.net mvc 2 带有ASP.NET MVC 2、NUnit和Rhino Mock的TDD控制器

Asp.net mvc 2 带有ASP.NET MVC 2、NUnit和Rhino Mock的TDD控制器,asp.net-mvc-2,tdd,nunit,rhino-mocks,Asp.net Mvc 2,Tdd,Nunit,Rhino Mocks,如果我使用Rhino Mocks、NUnit和ASP.NET MVC 2,那么一个简单的单元测试会是什么样的呢?我试图理解TDD的概念,但我看不出像“Controller XYZ Exists”这样的简单测试会是什么样子。此外,在视图下测试操作结果时,单元测试会是什么样子?为什么要测试控制器是否存在?您应该做的是测试控制器的行为。您的控制器是一个正在测试的代码,您对它提出了一些期望,然后断言是否满足了期望 关于如何使用ASP.NET MVC进行TDD,有许多演练。例如,您可以从这里开始 确认控

如果我使用Rhino Mocks、NUnit和ASP.NET MVC 2,那么一个简单的单元测试会是什么样的呢?我试图理解TDD的概念,但我看不出像“Controller XYZ Exists”这样的简单测试会是什么样子。此外,在视图下测试操作结果时,单元测试会是什么样子?

为什么要测试控制器是否存在?您应该做的是测试控制器的行为。您的控制器是一个正在测试的代码,您对它提出了一些期望,然后断言是否满足了期望

关于如何使用ASP.NET MVC进行TDD,有许多演练。例如,您可以从这里开始

确认控制器存在

对其动作进行单元测试是控制器存在的一个强烈建议,这使我们想到:

单元测试看起来像什么 在视图外测试操作结果

下面是一个例子:

public class HomeController: Controller
{
    private readonly IRepository _repository;
    public HomeController(IRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Index()
    {
        var customers = _repository.GetCustomers();
        return View(customers);
    }
}
以及相应的单元测试:

[Test]
public void HomeController_Index_Action_Should_Fetch_Customers_From_Repo()
{
   // arrange
   var repositoryStub = MockRepository.GenerateStub<IRepository>();
   var sut = new HomeController(repositoryStub);
   var expectedCustomers = new Customer[0];
   repositoryStub
       .Stub(x => x.GetCustomers())
       .Return(expectedCustomers);

   // act
   var actual = sut.Index();

   // assert
   Assert. IsInstanceOfType(typeof(ViewResult), actual);
   var viewResult = (ViewResult)actual;
   Assert.AreEqual(expectedCustomers, viewResult.ViewData.Model);
}
[测试]
public void HomeController\u Index\u Action\u应\u从\u Repo()获取\u客户\u
{
//安排
var repositoryStub=MockRepository.generateSub();
var sut=新的HomeController(repositoryStub);
var expectedCustomers=新客户[0];
寄存存根
.Stub(x=>x.GetCustomers())
.退货(预期客户);
//表演
var-actual=sut.Index();
//断言
Assert.IsInstanceOfType(typeof(ViewResult),实际值);
var viewResult=(viewResult)实际值;
AreEqual(expectedCustomers、viewResult.ViewData.Model);
}

有一些很好的特性,允许您模拟HttpContext,而且。

我已经看到了,但它是错误的。每次测试的断言次数不得超过一次。此外,它更关注于存储库测试,而不是简单的控制器测试?在遥远的银河系中,这在某些情况下可能是有意义的,但对于控制器测试来说,这毫无意义。更重要的是,我使用的是ASP.NET MVC 2。我们是否假设您的控制器在运行时注册?在这种情况下,您不想要集成测试而不是单元测试吗?