Kar*_*ran 3 unit-testing mstest controllers asp.net-mvc-3
我是MVC .NET的新手(我之前曾在Ruby On Rails上工作).
我想知道如何编写单元测试来检查正确的参数是否传递到视图中.
public ActionResult Users()
{
var users = userManager.GetUsers();
return View(users);
}
Run Code Online (Sandbox Code Playgroud)
如何测试View已与用户列表一起传递?我只是模拟View静态方法还是有更好的方法?
谢谢!
您应该模拟该userManager.GetUsers方法,然后断言控制器操作返回一个ViewResult,其模型等于模拟的用户列表.当然,为了能够模拟userManager.GetUsers方法,这个方法需要是虚拟的:
例如:
public class HomeController: Controller
{
private readonly IUsersManager _usersManager;
public HomeController(IUsersManager usersManager)
{
_usersManager = usersManager;
}
public ActionResult Users()
{
var users = _usersManager.GetUsers();
return View(users);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在单元测试中,您可以提供IUsersManager接口的模拟实例并定义对GetUsers方法的期望.
使用像Rhino Mocks这样的模拟框架,这是一项微不足道的任务:
[TestMethod]
public void Users_Action_Should_Query_The_UserManager_Repository_And_Pass_The_Result_To_The_View()
{
// arrange
var expectedUsers = new User[] { new User() };
var usersManagerStub = MockRepository.GenerateStub<IUsersManager>();
usersManagerStub.Stub(x => x.GetUsers()).Return(expectedUsers);
var sut = new HomeController(usersManagerStub);
// act
var actual = sut.Users();
// assert
Assert.IsInstanceOfType(actual, typeof(ViewResult));
var viewResult = actual as ViewResult;
Assert.AreEqual(expectedUsers, viewResult.Model);
}
Run Code Online (Sandbox Code Playgroud)
它使用MVCContrib.TestHelper,它为您提供了更流畅的语法,简化了标准HTTP工件的模拟,例如上下文,会话,cookie,......:
[TestMethod]
public void Users_Action_Should_Query_The_UserManager_Repository_And_Pass_The_Result_To_The_View()
{
// arrange
var expectedUsers = new User[] { new User() };
var usersManagerStub = MockRepository.GenerateStub<IUsersManager>();
usersManagerStub.Stub(x => x.GetUsers()).Return(expectedUsers);
var sut = new HomeController(usersManagerStub);
// act
var actual = sut.Users();
// assert
actual
.AssertViewRendered()
.WithViewData<User[]>()
.ShouldEqual(expectedUsers, "");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1510 次 |
| 最近记录: |