如何模拟UnityEngine.Object.Destroy()调用?

时间:2013-07-01 13:04:39

标签: c# unit-testing nunit unity3d moq

有没有办法验证是否为特定的GameObject调用了UnityEngine.Object.Destroy()方法?由于UnityEngine.Object没有接口我无法模拟它并检查Verifiable()。我正在使用C#,NUnit和Moq。

例如:

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 个答案:

答案 0 :(得分:1)

凭借其当前状态,UnityEngine不支持使用Moq进行模拟。这是因为Moq(或基于DynamicProxy 1 的任何其他框架)不能模拟不可覆盖/可实现的成员(在接口的情况下)。

您最好的选择是按照建议创建一个包装器并将其注入通常使用UnityEngine的类。这样,您就可以正确地对这些类进行单元测试。不幸的是,包装器本身仍然是不可测试的(使用Moq)并且没有什么可以在这里完成,除非你使用不同的隔离框架支持静态成员模拟或使用UnityEngine的真实实现(如常规集成测试那样)。

1 我在博文中解释了这个限制背后的一些细节 - How to mock private method?