c# - 如何模拟 SendGrid

标签 c# unit-testing moq mstest 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());
    }

但是,我收到以下错误:

Invalid setup on a non-virtual (overridable in VB) member: x => x.DeliverAsync

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

最佳答案

好的,我修好了:)

你不应该使用 Web 类,而应该使用 ITransport 接口(interface):

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

var em = new EmailManager(transport.Object);

我还使用了 extensions methodsSimon V 创建.

关于c# - 如何模拟 SendGrid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24508975/

相关文章:

java - Cobertura 覆盖率和 assert 关键字

c# - 最小起订量的链接方法

c# - 如何在 Debug模式下浏览所有 session 变量?

c# - TextBlock 上的 TiltEffect

c# - 有没有什么解决方案可以用 C# 开发黑莓应用程序,比如用于 Android 的 Mono 或 Monotouch?

c# - 缩放时线条消失(使用 "Dynamic data display")

python - assertRaisesRegexp 确实可以在 Python2 中使用 unicode

c# - 在单元测试中跳过内部方法调用

c# - 模拟具有不同签名的方法,其中一个方法具有 Object 作为参数类型

c# - 工作 LINQ 查询在单元测试中不起作用