我从一位同事那里接管了一个ASP.NET MVC项目。我对ASP.NET MVC和单元测试都只有基本的了解。
我正试图通过创建单元测试来右脚起步。我以为我会开始测试一个控制器。不幸的是,我偶然发现了第一道障碍!有问题的控制器具有通过依赖注入(Unity)注入的Authorize属性和依赖项。
控制器看起来像:
namespace Project.Controllers
{
[Authorize( Roles = "Admin,PurchaseOrderUser" )]
public class SomeController : Controller
{
private readonly IOrganisationService _organisationService;
private readonly IPurchaseOrderService _purchaseOrderService;
// Dependency injection will provide these
public SomeController(
IPurchaseOrderService purchaseOrderService,
IOrganisationService organisationService)
{
_purchaseOrderService = purchaseOrderService;
_organisationService = organisationService;
}
// List Purchase Orders
public ActionResult Index( )
{
Return View();
}
// Rest of controller....
那么,使用nUnit和Rhino Mock Mocks如何测试Index操作?
感谢。
Alan T
答案 0 :(得分:2)
您不应该测试属性本身,而应该测试是否通过反射在控制器上声明属性。
这样想,如果你实现了自己的Authorize-attribute,你应该对属性代码编写测试,看看它是否有效。当您稍后在控制器上使用它时,您已经测试了该属性的功能,只需要知道控制器是否正在使用它。
您通过自己喜欢的Mock框架创建的依赖关系并以Mattias身份注入。
答案 1 :(得分:1)
您不应该关心Authorize属性,因为它位于asp.net mvc框架内,您必须假设框架已经过测试。你只需要担心依赖关系。这很简单,因为你需要做的就是创建依赖项的模拟实例,然后用它们实例化一个新的控制器。像这样:
[Test]
public void TestMethod() {
var organisationService = MockRepository.GenerateMock<IOrganisationService>();
var purchaseOrderService = MockRepository.GenerateMock<IPurchaseOrderService>();
//Setup your mocks
var controller = new SomeController(organisationService, purchaseOrderService);
var result = controller.Index();
//Your asserts
}
您不要使用ioc容器在测试中注入依赖项。