我试图从测试中抛出一个异常(使用rhino和nunit),但它不能像预期的那样工作
接口
public interface IEmailService
{
void SendEmail(string to, string subject, string body);
}
public interface IWebService
{
void LogError(string message);
}类
public class MockService : IWebService
{
public string LastError;
public void LogError(string message)
{
LastError = message;
}
}
public class LogAnalyzerDynamicMockWithEmail
{
public IWebService Service { get; set; }
public IEmailService Email { get; set; }
public void Analyze(string fileName)
{
try
{
if (fileName.Length < 8)
Service.LogError("Filename too short:" + fileName);
}
catch (Exception exception)
{
Email.SendEmail("a", "subject", exception.Message);
}
}
}这是测试方法
[Test]
public void Analyze_WebServiceThrows_SendsEmail()
{
var mockRepository = new MockRepository();
var stubWebService = mockRepository.Stub<IWebService>();
var mockEmailService = mockRepository.StrictMock<IEmailService>();
var logAnalyzerDynamicMockWithEmail = new LogAnalyzerDynamicMockWithEmail
{
Service = stubWebService,
Email = mockEmailService
};
stubWebService.Stub(m => m.LogError("whatever")).IgnoreArguments().Throw(new Exception("fake exception"));
Assert.Throws<Exception>(() => { logAnalyzerDynamicMockWithEmail.Analyze("abc.ext"); });
mockEmailService.AssertWasCalled(m => m.SendEmail("a", "subject", "fake exception"));
}但是测试失败了,消息是"Expected: <system.exception>, but was: null“
有人能帮我指出我这里遗漏了什么吗?
发布于 2016-10-27 01:55:05
我不确定为什么您的模拟没有抛出异常,但我建议使用较新的RhinoMock语法(不需要实例化MockRepository)。此外,您的Assert.Throws调用将不起作用,因为您的代码正在捕获异常。只有当异常未被捕获时,Assert.Throws才有用。
下面是一个有效的示例。请注意,我将SendEmail期望移到了Analyze调用之上。不管mock上的期望值有多少,调用VerifyAllExpectations将确保它们得到满足。
[Test]
public void Analyze_WebServiceThrows_SendsEmail_Modified()
{
var stubWebService = MockRepository.GenerateMock<IWebService>();
var mockEmailService = MockRepository.GenerateMock<IEmailService>();
var logAnalyzerDynamicMockWithEmail = new LogAnalyzerDynamicMockWithEmail
{
Service = stubWebService,
Email = mockEmailService
};
// Set up our expectations
stubWebService.Expect(m => m.LogError("whatever")).IgnoreArguments().Throw(new Exception("fake exception"));
mockEmailService.Expect(m => m.SendEmail("a", "subject", "fake exception")).Repeat.Once();
logAnalyzerDynamicMockWithEmail.Analyze("abc.ext");
// Verify our SendEmail method was called
mockEmailService.VerifyAllExpectations();
}发布于 2017-01-05 22:39:42
您的.Analyze()方法正在捕获异常,而不是重新抛出它,因此它永远不会返回到Assert.Thows()调用。
catch (Exception exception)
{
Email.SendEmail("a", "subject", exception.Message);
}因此,您的测试正确地失败了。对Analyze()的调用不会引发异常。相反,它捕获由您的mock抛出的异常,发送一封电子邮件并继续。如果你想让它抛出,你需要在你的catch块中重新抛出异常,如下所示:
catch (Exception exception)
{
Email.SendEmail("a", "subject", exception.Message);
throw;
}https://stackoverflow.com/questions/40263075
复制相似问题