1

こんにちは、 IUnityContainer をモックするのに苦労しています。具体的には、 Register Type が呼び出されたかどうかを確認しようとしています。これは、テストしようとしているメソッドです。

    private readonly IUnityContainer _container;

    public InjectorContainer(IUnityContainer container)
    {
        _container = container;
    }

    public void RegisterType(InjectorServiceModel dependencyService)
    {
        _container.RegisterType(dependencyService.From, dependencyService.To);
    }

これは私のUnityテストクラスです:

 private Mock<IUnityContainer> _unitContaineMock;
    private InjectorContainer _injectorContainer;

    [TestInitialize]
    public void Initializer()
    {
        _unitContaineMock = new Mock<IUnityContainer>();
        _injectorContainer = new InjectorContainer(_unitContaineMock.Object);
    }

    [TestMethod]
    public void RegisterType_CheckIfContainerRegisterTypeIsCalled_Oance()
    {
        //Arrange
        var injectorServiceModel = new InjectorServiceModel()
        {
            From = typeof(IInjectorContainerFake),
            To = typeof(InjectorContainerFake)
        };
        bool wasCalled = false;
        _unitContaineMock.Setup(x => x.RegisterType(It.IsAny<Type>(), It.IsAny<Type>())).Callback(() =>
        {
            wasCalled = true;
        });
        //Act
        _injectorContainer.RegisterType(injectorServiceModel);

        //Assert
        Assert.IsTrue(wasCalled);
    }

この状態のコードは、実際に私が最初に試した 2 回目の試行です。

 [TestMethod]
    public void RegisterType_CheckIfContainerRegisterTypeIsCalled_Oance()
    {
        //Arrange
        var injectorServiceModel = new InjectorServiceModel()
        {
            From = typeof(IInjectorContainerFake),
            To = typeof(InjectorContainerFake)
        };
        //Act
        _injectorContainer.RegisterType(injectorServiceModel);

        //Assert
        _unitContaineMock.Verify(x => x.RegisterType(It.IsAny<Type>(), It.IsAny<Type>()), Times.Once);

    }

どちらの場合も、次のメッセージを持つ SystemNotSuported 例外が発生します。

非仮想 (VB でオーバーライド可能) メンバーに対する無効な検証: x => x.RegisterType(It.IsAny(), It.IsAny(), new[] { })

これから理解できることから、検証しようとしているときに、3 つのパラメーターを持つ RegisterType を探しているようです。

ここで私が間違っていることを誰かが知っていますか?

RegisterType が呼び出されたかどうかをテストしようとしています。

4

1 に答える 1

3

これを取得している理由は、RegisterType呼び出しているオーバーロードが実際には他の場所で定義された拡張メソッドであり、拡張メソッドで Setup/Verify を使用できないためです (技術的に静的であるため)。IUnityContainerこれは、http : //msdn.microsoft.com/en-us/library/microsoft.practices.unity.iunitycontainer_members (v=pandp.30).aspxのメソッド リストに基づいています。RegisterTypeインターフェイスで実際に定義されているのはこれだけで、ご覧のとおり、5 つのパラメーターを取ります。

可能な解決策:

  1. 代わりに、5 つのパラメーターを受け取るオーバーロードを使用してください。その上で検証を行うことができます。しかし、単体テストを記述できるようにするためだけにコードを複雑にするのは、もちろんばかげています。
  2. モックの代わりに「実際の」コンテナーを使用し、Verify を実行する代わりに、単体テストでIsRegisteredオーバーロードの 1 つを呼び出して、型が実際にコンテナーに追加されているかどうかを確認します。とにかく、これは望ましいアプローチかもしれません。それは確かに壊れにくくなります。単体テストでは、コンテナーに型を追加するために使用された特定のメソッドを気にする必要はありません。タイプが追加されたことを確認するだけです。
于 2013-09-07T13:24:53.607 に答える