2013-07-01 57 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?

-

我在我的博客中解释了这一限制背后的详细位