假设我有一个简单的API类像这样,在外部调用时,但如果它没有完成的例外是5秒钟后抛出:C# - 测试断言组件超时X秒后
public class Api
{
private readonly IConnector connector;
public Api(IConnector connector)
{
this.connector = connector;
}
public string GetSomething()
{
var timer = new System.Timers.Timer(5000);
timer.Elapsed += TimeOut;
timer.Start();
//some external call which takes time
connector.Retrieve();
timer.Stop();
return "Something";
}
private void TimeOut(object sender, ElapsedEventArgs e)
{
throw new TimeoutException("Timed out!");
}
}
使用NUnit或其他方法,我该如何去测试上述请求需要8秒时抛出异常,但当请求需要3秒时成功?
我已经试过以下:
[TestFixture]
public class ApiTests
{
IConnector mockConnector;
Api api;
[SetUp]
public void Setup()
{
mockConnector = MockRepository.GenerateMock<IConnector>();
api = new Api(mockConnector);
}
[Test]
public void Api_RetrieveTakes3Seconds_SomethingReturned()
{
mockConnector.Stub(c => c.Retrieve()).Return(Task.Delay(3000).ContinueWith(c => "Something").Result);
var response = api.GetSomething();
Assert.AreEqual("Something", response);
}
[Test]
public void Api_RetrieveTakes8Seconds_TimeOutExceptionThrown()
{
mockConnector.Stub(c => c.Retrieve()).Return(Task.Delay(8000).ContinueWith(c => "Something").Result);
var response = api.GetSomething();
//assert an exception is thrown on the above
}
}
但如预期,这并不工作,当我调试任务只是等待在X秒存根线(api.GetSomething()之前,甚至称为)
如何调整这些测试以获得所需的行为?
作为一个额外的好处,如果可以不必等待其余的运行,这将是非常好的。
也许尝试“mockConnector.Stub(c => c.Retrieve())。Return(()=> Task.Delay(3000).ContinueWith(c =>”Something“)。Result);”让你的代码在正确的线上等待? – JBdev