0

登録が成功したことを確認するために、Moqでユニットテストを作成しようとしています。私のテストは次のとおりです。

    [TestMethod()]
    public void RegisterTest()
    {
        //Arrange
        var MockRepo = new Mock<IDataRepo>() ;             
        RegisterModel model = new RegisterModel
        {
            ConfirmPassword = "SamePassword",
            Email = "myemail@address.com",
            FirstName = "MyFirstName",
            LastName = "MyLastName",
            MiddleName = "MyMiddleName",
            Password = "SamePassword"
        };
        MockRepo.Setup(ctx => ctx.Add(model)).Verifiable("Nothing was added to the Database");

        //Act
        AccountController target = new AccountController(MockRepo.Object);

        //Assert
        ActionResult actual = target.Register(model);
        MockRepo.Verify(ctx => ctx.Add(It.IsAny<RegisterModel>()));
        Assert.IsInstanceOfType(actual, typeof(ViewResult));
    }

しかし、次のエラーで失敗します

少なくとも1回はモックでの呼び出しが必要ですが、実行されませんでした:ctx => ctx.Add(It.IsAny())

ただし、テストメソッドをデバッグすると、Add(T)メソッドが実際に呼び出されていることに気付きました。MOQdllのバージョンはv4.0です

アカウントコントローラーの更新:

public class AccountController : Controller
{

    private IDataRepo _repo;

    public AccountController(IDataRepo Repo)
    {
        _repo = Repo;
    }

    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            User user = _repo.Users.Where(u => u.Email == model.Email).FirstOrDefault();
            if (user == null)
            {
                _repo.Add(new User
                {
                    Email = model.Email,
                    Password = model.Password,
                    FirstName = model.FirstName,
                    LastName = model.LastName,
                    MiddleName = model.MiddleName
                });

                return View("RegistrationSuccess");
            }
            else
            {
                ModelState.AddModelError("UserExists", "This Email already Exists");
            }
        }
        return View(model);
    }
}
4

2 に答える 2

2

あなたの問題は、モックがRegisterModelインスタンスを期待していることです

RegisterModel model = new RegisterModel
{
    ConfirmPassword = "SamePassword",
    Email = "myemail@address.com",
    FirstName = "MyFirstName",
    LastName = "MyLastName",
    MiddleName = "MyMiddleName",
    Password = "SamePassword"
};

MockRepo.Setup(ctx => ctx.Add(model))

しかし、AddメソッドはUserクラスのインスタンスで呼び出されます

_repo.Add(new User
{
    Email = model.Email,
    Password = model.Password,
    FirstName = model.FirstName,
    LastName = model.LastName,
    MiddleName = model.MiddleName
});

したがって、これを回避する 1 つの方法は、Userインスタンスを受け入れるようにモックをセットアップすることです。

RegisterModel model = new RegisterModel
{
    ConfirmPassword = "SamePassword",
    Email = "myemail@address.com",
    FirstName = "MyFirstName",
    LastName = "MyLastName",
    MiddleName = "MyMiddleName",
    Password = "SamePassword"
};
User expected = new User
{
    Email = model.Email,
    Password = model.Password,
    FirstName = model.FirstName,
    LastName = model.LastName,
    MiddleName = model.MiddleName
};
MockRepo.Setup(ctx => ctx.Add(expected))
于 2012-08-03T11:32:17.147 に答える
0

もっと簡単にできる方法を発見しました。独自の User オブジェクトを生成するのではなく、呼び出すことができIt.IsAny<User>()、テストは問題なく実行されます。だから私のユニットテストは今..

        //Arrange
        var MockRepo = new Mock<IDataRepo>() ;             
        var MockMembership = new Mock<IMembership>();
        RegisterModel model = new RegisterModel
        {
            ConfirmPassword = "SamePassword",
            Email = "myemail@address.com",
            FirstName = "MyFirstName",
            LastName = "MyLastName",
            MiddleName = "MyMiddleName",
            Password = "SamePassword"
        };

        MockRepo.Setup(ctx => ctx.Add(It.IsAny<User>())).Verifiable("Nothing was added to the Database");
        //Act
        AccountController target = new AccountController(MockRepo.Object, MockMembership.Object);

        //Assert
        ActionResult actual = target.Register(model);
        MockRepo.Verify(ctx => ctx.Add(It.IsAny<User>()));
        Assert.IsInstanceOfType(actual, typeof(ViewResult));
于 2012-08-06T08:46:13.487 に答える