我如何从该模拟服务获得结果?

时间:2019-05-09 12:19:01

标签: c# .net-core

如何从模拟服务获得结果?注意:它可以正常工作。我只是想让测试顺利进行。

服务:

    public interface ISendgridService
{
    Task<Response> SendAsync(IEmailMessage emailMessage);
}

//测试

        [TestMethod]
    public async Task SendEmailTest()
    {
        // Arrange
        var mockSendgrid = new Mock<ISendgridService>();

        var response = new Mock<Func<SendGrid.Response>>();

        mockSendgrid.Setup(s => s.SendAsync(It.IsAny<IEmailMessage>()))
            .ReturnsAsync(response.Object.Invoke);

        var emailMessage = _builder.CreateNew<EmailMessage>()
            .With(e => e.From = _sendgridConfiguration.SenderEmail)
            .With(e => e.FromName = _sendgridConfiguration.SenderName)
            .With(e => e.To = Faker.Internet.Email())
            .Build();


        // Act
        var result = await mockSendgrid.Object.SendAsync(emailMessage);

        // Assert
     // result is null // How do I get a value?
    }

3 个答案:

答案 0 :(得分:3)

对于您要测试的内容,我有些困惑。通常,您将作用于受测的具体类,而不是存根对象。

下面的伪代码:

public class SendGridService : ISendGridService {
  public async Task<bool> SendAsync() {
    //code that sends the email
  }
}

您的测试将是:

//Act
var subject = new SendGridService();
var result = await subject.SendAsync();

//Assert
Assert.IsTrue(result);

答案 1 :(得分:1)

您已将df = df.sort_values(['Key', 'start_dt']) df['end_dt'] = df.groupby('Key').start_dt.shift(-1) print(df.reset_index(drop=True)) Key start_dt end_dt 0 1 15-07-2019 25-05-2019 1 1 25-05-2019 30-06-2019 2 1 30-06-2019 NaN 3 2 15-07-2019 17-07-2019 4 2 17-07-2019 NaN 设置为返回内容-它使用了另一个模拟-Mock<ISendgridService>并返回了调用该Mock<Func<SendGrid.Response>>的结果。

但是您尚未设置Func来返回任何内容,因此不会返回。

换句话说,当您这样做时:

Mock<Func<SendGrid.Response>>

mockSendgrid.Setup(s => s.SendAsync(It.IsAny<IEmailMessage>())) .ReturnsAsync(response.Object.Invoke); 返回什么? response.Object.Invokeresponse.Object,但尚未设置为返回任何内容。

Mock<Func<SendGrid.Response>>实际上更容易模拟而无需使用Moq。您可以这样做:

Func

答案 2 :(得分:0)

这取决于您要测试的应用程序,如果您要测试该应用程序是否发送电子邮件,则如果要实际测试它是否发送,则不应使用模拟类。您应该嘲笑的是电子邮件的内容。

现在,如果您要检查的是包括电子邮件在内的某些步骤是否有效(将所有步骤集成到一个方法中)又是另一回事,在这种情况下,您应该使用一个虚拟任务来返回虚拟响应。