Модульные тесты MvcMailer: System.ArgumentNullException httpContext не может быть нулевым - PullRequest
8 голосов
/ 21 мая 2011

Я не могу успешно запустить модульные тесты для MvcMailer, используя набор тестов Visual Studio и Moq. Я скопировал пример из вики слово в слово, но каждый раз получаю следующее исключение:

Test method MvcMailerTest.Tests.MailerTest.TestMethod1 threw exception: 
System.ArgumentNullException: Value cannot be null.
Parameter name: httpContext

Код выглядит следующим образом: (При использовании среды модульного тестирования VS - точно такая же ошибка при использовании nUnit, как в примере)

        //Arrange: Moq out the PopulateBody method
        var _userMailerMock = new Mock<UserMailer>();
        _userMailerMock.Setup(mailer => mailer.PopulateBody(It.IsAny<MailMessage>(), "Welcome", null));            
        _userMailerMock.CallBase = true;

        //Act
        var mailMessage = _userMailerMock.Object.Welcome();

Ошибка в следующей строке в методе Welcome () (скопировано прямо из вики):

 PopulateBody(mailMessage, viewName: "Welcome");

Вики здесь: https://github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide

Аналогично (почти точно так же) Вопрос: MvcMailer: Не удается завершить тесты NUnit в представлениях Razor, в которых используется Url.Action

Кто-нибудь знает, как это исправить? Связанный вопрос говорит, что мне нужно смоделировать метод PopulateBody, который я сделал (согласно вики).

Ответы [ 4 ]

3 голосов
/ 08 марта 2013

Быстрое дополнение к ответу Филипа, которое может оказаться полезным: я использую версию 4.0 пакета MvcMailer.Я использовал метод Populate(Action<MvcMailMessage> action) в действиях своей почтовой программы и заметил, что он использует PopulateBody 1004 -параметр с параметрами *1006*:

// Mvc.Mailer.MailerBase (using ILSpy)
public virtual MvcMailMessage Populate(Action<MvcMailMessage> action)
{
    MvcMailMessage mvcMailMessage = new MvcMailMessage();
    action(mvcMailMessage);

    // Four parameters! (comment added by me)
    this.PopulateBody(mvcMailMessage, mvcMailMessage.ViewName, mvcMailMessage.MasterName, mvcMailMessage.LinkedResources);

    return mvcMailMessage;
}

Как таковойЯ обнаружил, что настройка макета с четырьмя параметрами ...

PopulateBody(mailMessage, "Welcome", "SomeMasterName", null);

... сделала свое дело.

2 голосов
/ 23 апреля 2012

Обходной путь должен изменить ваш код следующим образом:

PopulateBody(mailMessage, "Welcome", null);

Это будет работать, потому что у вас есть фиктивная установка для этой перегрузки PopulateBody, а не для версии с 2 параметрамиэто ..

0 голосов
/ 22 мая 2011

Я подозреваю, что это связано с тем, что вы переназначаете новый макет для переменной _userMailerMock и, следовательно, фактически не насмехаетесь над методом PopulateBody.

var _userMailerMock = new Mock<UserMailer>();
_userMailerMock.Setup(mailer => mailer.PopulateBody(It.IsAny<MailMessage>(), "Welcome", null));
_userMailerMock.CallBase = true;

Вынимаете второе назначение _userMailerMock = new Mock<UserMailer>();строка перед Callbase = true;

0 голосов
/ 21 мая 2011

Вам, вероятно, тоже нужно издеваться над HttpContext. Вы можете сделать это, создав фиктивный объект HttpContextBase и назначив его объекту Controller.

...