1

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

例如:

UnityEngine.Object.Destroy(audioSource);

我发现的唯一一件事是如何模拟(使用 Moq)Unity 方法,但这不是我需要的。

感谢您提供有关此主题的任何帮助或更多信息!

我还做的一件事是,我将上面的调用提取到调用接口中,并验证该方法是否被调用,但这样我只会将问题转移到另一层。

public interface IAudioSource
{
    void DestroyUnityObject();
}

然后我可以在那里调用 Unity Destroy 方法。

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

并模拟上层方法调用。

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

但正如我所说,这只会将问题放在其他地方,我仍然无法验证 Unity 方法是否被正确调用。

4

1 回答 1

1

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

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

1我在我的博客文章中解释了这个限制背后的一些细节 -如何模拟私有方法?

于 2013-07-01T14:15:13.430 回答