簡體   English   中英

如何模擬SendGrid

[英]How to mock 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

有人知道我該如何解決嗎?

好吧,我修好了:)

您不應使用Web類,而應使用ITransport接口:

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

var em = new EmailManager(transport.Object);

我還使用了Simon V創建的擴展方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM