2015-02-05 83 views
0

使用JustMock: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

如何將'statusError'傳遞給'QueueDAO.UpdateQueueStatus'? – 2015-02-05 20:15:00

+0

作爲一個枚舉?不確定你的意思是「如何」? – dcinadr 2015-02-05 21:44:20

回答

0

可能的問題是QueueDAO.UpdateQueueStatus未使用預期參數調用。檢查是否將.IgnoreArguments()條款添加到其安排將使其工作。如果是的話,那麼這是一個爭論的問題。

使用調試器仔細檢查方法調用的參數。或者,您可以在調試器中觀看DebugView.FullTrace,向下瀏覽至QueueDAO.UpdateQueueStatus調用的截取內容,並查看調用的參數以及爲什麼沒有選擇該調用的安排。