使用JustMock:
我不确定为什么我的安排要求静态方法试图执行原始方法。
[Test]
public void RunCompleteDivxJob_Negative_Exception()
{
DebugView.IsTraceEnabled = true;
var mediaId = 2000999;
var mediaTypeId = (int)CmtMediaType.Video;
var queueCmtId = 9999;
var cmtFileType = CmtFileType.SourceMediaFile;
var statusError = CmtQueueStatus.Error;
var exception = new Exception("test");
// ARRANGE
var encodeJobStateMachineManager = Mock.Create<EncodeJobStateMachineManager>(Behavior.CallOriginal);
var logger = Mock.Create<Logger>(Behavior.CallOriginal, typeof(EncodeJobStateMachineManager));
var inst = new PrivateAccessor(encodeJobStateMachineManager);
inst.SetProperty("_log", logger);
var createCompleteJobCalled = false;
Mock.Arrange(() => DivxEncodeJob.CreateCompleteJob(mediaId, mediaTypeId, queueCmtId, cmtFileType))
.DoInstead(() => createCompleteJobCalled = true);
Mock.Arrange(() => encodeJobStateMachineManager.EncodeJob.Submit()).Throws(exception).MustBeCalled();
logger.Arrange(x => x.Error(Arg.AnyString, exception)).MustBeCalled();
//Mock.SetupStatic(typeof(QueueDAO));
var updateQueueStatusCalled = false;
Mock.Arrange(() => QueueDAO.UpdateQueueStatus(queueCmtId, statusError)).DoInstead(() => updateQueueStatusCalled = true);
// ACT
encodeJobStateMachineManager.RunCompleteDivxJob(mediaId, mediaTypeId, queueCmtId, cmtFileType);
// ASSERT
Mock.Assert(encodeJobStateMachineManager);
Assert.IsTrue(createCompleteJobCalled);
Assert.IsTrue(updateQueueStatusCalled);
}
第一个静态调用正确地模拟了方法调用:
Mock.Arrange(() => DivxEncodeJob.CreateCompleteJob(mediaId, mediaTypeId, queueCmtId, cmtFileType))
.DoInstead(() => createCompleteJobCalled = true);
但是第二个静态调用正在执行原始代码:
Mock.Arrange(() => QueueDAO.UpdateQueueStatus(queueCmtId, statusError)).DoInstead(() => updateQueueStatusCalled = true);
这些基本上被称为完全相同。那么为什么第一个按预期工作而第二个没有工作呢?
答案 0 :(得分:0)
可能的问题是QueueDAO.UpdateQueueStatus
没有使用预期的参数调用。检查在其安排中添加.IgnoreArguments()
子句是否有效。如果是,那么它就是参数的问题。
使用调试器仔细检查调用该方法的参数。或者,您可以在调试器中查看DebugView.FullTrace
,浏览到QueueDAO.UpdateQueueStatus
调用的拦截,并查看它所调用的参数以及为什么没有为该调用选择任何安排。