如何从模拟服务获得结果?注意:它可以正常工作。我只是想让测试顺利进行。
服务:
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?
}
答案 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.Invoke
是response.Object
,但尚未设置为返回任何内容。
Mock<Func<SendGrid.Response>>
实际上更容易模拟而无需使用Moq。您可以这样做:
Func
答案 2 :(得分:0)
这取决于您要测试的应用程序,如果您要测试该应用程序是否发送电子邮件,则如果要实际测试它是否发送,则不应使用模拟类。您应该嘲笑的是电子邮件的内容。
现在,如果您要检查的是包括电子邮件在内的某些步骤是否有效(将所有步骤集成到一个方法中)又是另一回事,在这种情况下,您应该使用一个虚拟任务来返回虚拟响应。