RhinoMocks AssertWasCalled создает исключение

Я новичок в TDD и RhinoMocks.

Я пытаюсь проверить AssertWasCalled, но возникают проблемы. Конструктор для моего теста выглядит следующим образом:

    public AccountControllerTests()
    {
        _webAuthenticator = MockRepository.GenerateMock<IWebAuthenticator>();
    }

И мой тест таков:

    [TestMethod]
    public void AccountControllerCallsWebAuthenticator_CreateSignInTicketForGoodLoginCredentials()
    {
        const string username = "good-username";
        const string password = "good-password";

        var model = new LoginModel { Username = username, Password = password };

        _webAuthenticator.Stub(w => w.Authenticate(username, password)).Return(true);

        var mockHttpContextBase = MockRepository.GenerateMock<HttpContextBase>();

        var accountController = new AccountController(_webAuthenticator);

        accountController.Login(model);

        _webAuthenticator.AssertWasCalled(x => x.CreateSignInTicket(mockHttpContextBase, username));
    }

Я получаю ошибку:

Метод испытания Paxium.Music.WebUI.Tests.Controllers.AccountControllerTests.AccountControllerCallsWebAuthenticator_CreateSignInTicketForGoodLoginCredentials бросил исключение: Rhino.Mocks.Exceptions.ExpectationViolationException: IWebAuthenticator.CreateSignInTicket(Castle.Proxies.HttpContextBaseProxy7f274f09b6124e6da32d96dc6d3fface, "хорошо-имя пользователя"); Ожидаемый #1, фактический #0.

Теперь я изменил свой код, как показано ниже - до и после кода:

До:

public class AccountController : Controller
{
    private readonly IWebAuthenticator _webAuthenticator;

    public AccountController(IWebAuthenticator webAuthenticator)
    {
        _webAuthenticator = webAuthenticator;
    }

    [HttpGet]
    public ActionResult Login()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Login(LoginModel model)
    {
        if (ModelState.IsValid)
        {
            if (_webAuthenticator.Authenticate(model.Username, model.Password))
            {
                _webAuthenticator.CreateSignInTicket(HttpContext, model.Username);

                return RedirectToAction("Index", "Home");
            }

            return View(model);
        }

        return View(model);
    }
}

После:

public class AccountController : Controller
{
    private readonly IWebAuthenticator _webAuthenticator;
    private readonly HttpContextBase _contextBase;

    public AccountController()
    {

    }

    public AccountController(IWebAuthenticator webAuthenticator, HttpContextBase contextBase)
    {
        _webAuthenticator = webAuthenticator;
        _contextBase = contextBase;
    }

    [HttpGet]
    public ActionResult Login()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Login(LoginModel model)
    {
        if (ModelState.IsValid)
        {
            if (_webAuthenticator.Authenticate(model.Username, model.Password))
            {
                _webAuthenticator.CreateSignInTicket(_contextBase, model.Username);

                return RedirectToAction("Index", "Home");
            }

            return View(model);
        }

        return View(model);
    }
}

Мои тесты сейчас проходят. Как я вводить в contextBase, хотя, когда мой контроллер используется для реального?? Я использую StructureMap.

1 ответ

Решение

Получаемое сообщение об ошибке указывает на то, что Assert не выполнен, т. Е. Объект webAuthenticator не был вызван с этими конкретными аргументами (следовательно, ожидается #1, фактическое сообщение об исключении #0).

Из предоставленного вами ограниченного контекста я подозреваю, что поддельный экземпляр HttpContextBase (mockHttpContextBase) в вашем тесте - это не тот же объект, который передается в webAuthenticator из вашего производственного кода.

Есть два способа сделать это: сделать утверждение менее строгим или убедиться, что производственный код использует поддельный объект контекста http. Если вам все равно, какой экземпляр HttpContext будет передан в webAuthenticator в этом тесте, вы можете использовать сопоставители аргументов (Rhinomocks называет их ограничениями аргументов). В вашем случае это будет примерно так:

_webAuthenticator.AssertWasCalled(x => x.CreateSignInTicket(Arg<HttpContextBase>.Is.Anything, Arg<string>.Is.Equal(username)));
Другие вопросы по тегам