2013-07-01 53 views
1

有沒有辦法來驗證爲特定的GameObject調用UnityEngine.Object.Destroy()方法?由於UnityEngine.Object沒有接口,我不能嘲笑它並檢查Verifiable()。我正在使用C#,NUnit和Moq。如何模擬UnityEngine.Object.Destroy()調用?

例如:

UnityEngine.Object.Destroy(audioSource); 

我發現的唯一的事情是這個How to Mock (with Moq) Unity methods但這不是我所需要的。

我明白任何幫助或有關此主題的更多信息!

有一件事我還做了是我提取呼叫從上方插入到調用接口並驗證該方法被調用,但這種方式我只是問題轉移到另一個層。

public interface IAudioSource 
{ 
    void DestroyUnityObject(); 
} 

然後我可以在那裏調用Unity Destroy方法。

public void DestroyUnityObject() 
{ 
    UnityEngine.Object.Destroy(mAudioSource); 
} 

並模擬上方法調用。

audioSourceMock.Setup(s => s.DestroyUnityObject()).Verifiable(); 

但正如我所說,這隻會把問題放在其他地方,我仍然無法驗證Unity方法是否正確調用。

回答

1

憑藉其當前狀態,UnityEngine不支持起訂量嘲諷。這是因爲起訂量(或基於DynamicProxy 任何其他框架)不能模擬部件,其不可重寫/可實現的(在接口的情況下)。

你最好的選擇將是如你所說,以創建一個包裝,並將它注入到通常會使用UnityEngine類。這樣,你可以正確地單元測試這些類。不幸的是,除非你使用支持靜態成員嘲諷的不同的隔離框架,或者使用UnityEngine的真正實現(就像常規的集成測試那樣),否則封裝本身仍然是不可測試的(Moq就是這樣)。 How to mock private method?

-

我在我的博客中解釋了這一限制背後的詳細位