3

私はMVC.NETを初めて使用します(以前はRuby On Railsに取り組んでいました)。

正しい引数がビューに渡されることを確認する単体テストをどのように作成できるのか疑問に思いました。

public ActionResult Users()
{
  var users = userManager.GetUsers();
  return View(users);
}

ビューがユーザーのリストで渡されたことをテストするにはどうすればよいですか?View staticメソッドを単にモックするのですか、それともより良いアプローチがありますか?

ありがとう!

4

1 に答える 1

6

メソッドをモックし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, "");
}
于 2012-05-15T13:26:33.573 に答える