メソッドをモックし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);
}
}
これで、単体テストで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);
}
MVContrib.TestHelperを使用すると、より流暢な構文が提供され、コンテキスト、セッション、Cookie などの標準 HTTP アーティファクトのモックが簡素化されます。
[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, "");
}