Как издеваться над SendGrid

Я пытаюсь написать модульный тест для написанного мной метода, который отправляет электронное письмо с помощью SendGrid. Мой метод примерно такой:

public async Task SendEmail(TemplatedMailMessage emailMessage)
{
    if (String.IsNullOrWhiteSpace(emailMessage.Html) || String.IsNullOrWhiteSpace(emailMessage.From.ToString()) || !emailMessage.To.Any())
    {
        throw new Exception("Html, From or To is empty");
    }

    try
    {
        // Send the email
        await this.TransportWeb.DeliverAsync(emailMessage.GetSendGridMessage());
    }
    catch (Exception ex)
    {
        //do stuff
    }

    //log success
}

TransportWeb - это свойство, которое задается в моем конструкторе с помощью параметра, поэтому я могу создать фиктивный объект.

public EmailManager(Web transportWeb = null)
{
    this.TransportWeb = transportWeb ?? SetupSendGrid();
}

В моем тестовом методе я пытаюсь имитировать свойство TransportWeb (типа SendGrid.Web):

    [TestMethod]
    public async Task SendEmail_ValidEmailTemplateAndNoParameters_EmailIsSent()
    {
        //ARRANGE
        var templatedMailmessage = new Mock<TemplatedMailMessage>();
        var transportWeb = new Mock<Web>();
        transportWeb.SetupAllProperties();
        transportWeb.Setup(x => x.DeliverAsync(It.IsAny<ISendGrid>()));
        var emailManager = new EmailManager(transportWeb.Object);

        //ACT
        await emailManager.Send(templatedMailmessage.Object);

        //ASSERT
        transportWeb.Verify(x => x.DeliverAsync(It.IsAny<ISendGrid>()), Times.Once());
    }

Однако я получаю следующую ошибку:

Недопустимая установка на невиртуальном (переопределяемом в VB) члене: x => x.DeliverAsync

Кто-нибудь знает, как я могу это исправить?


person Hans Leautaud    schedule 01.07.2014    source источник


Ответы (1)


Ладно починил :)

Вы должны использовать не веб-класс, а интерфейс ITransport:

var transport = new Mock<ITransport>();
transport.SetupAllProperties();
transport.Setup(x => x.DeliverAsync(It.IsAny<SendGridMessage>())).ReturnsTask();

var em = new EmailManager(transport.Object);

Я также использовал методы расширений, созданные Саймон В..

person Hans Leautaud    schedule 01.07.2014
comment
Кроме того, вы можете ознакомиться с прокладками. Классная изоляционная структура от MS, которая может имитировать все, что вы хотите. - person makambi; 04.07.2014