【发布时间】:2016-06-27 09:55:13
【问题描述】:
不知道如何实现这一点。我正在尝试对等待几分钟的方法进行单元测试,请参见此处:
internal class JctRestartViaSmsAttemptTestRunner : ITestRunner<JctRestartViaSmsAttempt>
{
private readonly IMayWantMonitoring _queues;
private readonly IAppSettings _appSettings;
public JctRestartViaSmsAttemptTestRunner(IMayWantMonitoring queues, IAppSettings appSettings)
{
_queues = queues;
_appSettings = appSettings;
}
public JctTest Execute(JctRestartViaSmsAttempt jctMessageType)
{
// after five minutes, publish an event to check if the JCT logged in
var jctLoggedInTimeOut = TimeSpan.FromMinutes(double.Parse(_appSettings["JctLogInTimeOut"]));
var message = new JctRestartViaSmsValidate(jctMessageType.Imei);
Task.Delay(jctLoggedInTimeOut)
.ContinueWith(x => _queues.Publish(message));
// reset test values
return new JctTest("6", jctMessageType.Imei, null, null, null);
}
}
这是我的测试方法,但我无法模拟任务延迟的东西。
[Test]
public void TaskTest()
{
// arrange
var imei = _fixture.Create<string>();
_appSettings.Setup(c => c["JctLogInTimeOut"]).Returns("5");
var message = _fixture.Build<JctRestartViaSmsAttempt>()
.With(x => x.Imei, imei)
.Create();
var sut = _fixture.Create<JctRestartViaSmsAttemptTestRunner>();
// act
sut.Execute(message);
// assert
_queues.Verify(x => x.Publish(It.Is<JctRestartViaSmsValidate>(y => y.Imei == imei)));
}
这是引发的错误:
Moq.MockException : 对模拟的预期调用至少一次, 但从未执行过:x => x.Publish(It.Is(y => y.Imei == .imei)) 否 配置的设置。未执行任何调用。在 Moq.Mock.ThrowVerifyException(MethodCall 预期,IEnumerable
1 setups, IEnumerable1 actualCalls,Expression 表达式,Times 次, Int32 callCount) 在 Moq.Mock.VerifyCalls(Interceptor targetInterceptor、MethodCall 预期、Expression 表达式、Times 次)在 Moq.Mock.Verify[T](Mock1 mock, Expression1 表达式, 次次,字符串 failMessage) 在 Moq.Mock1.Verify(Expression1 表达式)在 JustEat.PrivateAPN.Worker.UnitTests.TestRunners.JctRestartViaSmsAttemptTestFixture.RunJctTest_WhenRestartAttemptSmsIsSent_ShouldPublishJctRestartValidateMessageWithTheRightImei() 在
我知道我需要自定义/配置我的灯具才能进入回调,但我不知道该怎么做,非常感谢任何帮助
【问题讨论】:
-
我要验证_queues.Publish(message)的调用
-
JctRestartViaSmsValidate != JctRestartViaSmsAttempt -
var message = new JctRestartViaSmsValidate(jctMessageType.Imei);是放在_queues中的内容,_queues.Verify(x => x.Publish(It.Is<JctRestartViaSmsAttempt>(y => y.Imei == imei)));是您验证要进入队列的内容?即使这不能解决您的问题,在我看来它仍然是错误的 -
没错,我只是更新问题。错误还是一样。
-
Task.Delay在这里使用是完全错误的。您可能想尝试Thread.Sleep。如果你想要非阻塞版本,你需要让你的函数async和awaitTask.Delay
标签: c# moq autofixture