1

Is there a way to verify that a UnityEngine.Object.Destroy() method is called for a specific GameObject? Since the UnityEngine.Object is no interface I cannot mock it and check for Verifiable(). I am using C#, NUnit and Moq.

For example:

UnityEngine.Object.Destroy(audioSource);

The only thing I found was this How to Mock (with Moq) Unity methods but this is not what I need.

I appreciate any help or further information about this topic!

One thing I also did was that I extract the call from above into the calling interface and verify that this method is called, but this way I only shift the problem to another layer.

public interface IAudioSource
{
    void DestroyUnityObject();
}

Then I can call the Unity Destroy method in there.

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

And mock the upper method call.

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

But as I said, this only puts the problem elsewhere and I can still not verify that the Unity method is called correctly.

4

1 に答える 1

1

現在の状態では、UnityEngine は Moq によるモックをサポートしていません。これは、Moq (または DynamicProxy 1に基づく他のフレームワーク) が、(インターフェースの場合) オーバーライド/実装可能でないメンバーをモックできないためです。

あなたの最善の策は、あなたが提案したようにラッパーを作成し、それを通常使用するクラスに注入することUnityEngineです。このようにして、これらのクラスを適切に単体テストできます。残念ながら、ラッパー自体は (Moq を使用して) テストできないままであり、静的メンバーのモックをサポートする別の分離フレームワークを使用するか、UnityEngine の実際の実装を使用しない限り (通常の統合テストのように)、ここでは何もできません。

1この制限の背後にある詳細については、ブログ投稿 - How to mock private method?で説明しました。

于 2013-07-01T14:15:13.430 に答える