如何模拟SendGrid

本文关键字:SendGrid 模拟 何模拟 | 更新日期: 2023-09-27 18:11:09

我正试图为我编写的方法编写单元测试,该方法使用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

有谁知道我该如何解决这个问题吗?

如何模拟SendGrid

我修好了:)

你不应该使用Web类,而应该使用ittransport接口:

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

我还使用了Simon V.创建的扩展方法。