0

UnityAutoMoqContainer の使用を開始しました。ここにリンクが あります。特に container.GetMock() 呼び出しに関して、以下の 2 つの質問があります。

  1. 以下の Assert は成功すると思いますが、例外がスローされます。

    private UnityAutoMoqContainer container;
    
    [SetUp]
    public void SetUp()
    {
        container = new UnityAutoMoqContainer();
    }
    
    [Test]
    public void Are_mocks_Same(){
    
        var serviceMock = new Mock<IService>();
        var getMock = container.GetMock<IService>();             
        Assert.AreSame(getMock, serviceMock);
    }
    

エラー 1 テスト 'UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same' が失敗しました: 予想: C:\Users の UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same() と同じです……。

では、なぜ "Expected" と "But was" が同じ場合でも例外がスローされるのでしょうか?

私が見る違いは、GetMockが Unity を使用して、新しい Mockが解決しないi,e Resolve()依存関係を解決することです。しかし、この例外の原因を説明することはできません。

  1. 抽象型の解決:

    以下のように、Moq.Mock を使用して抽象型を解決します。

        var httpContextBaseMock = new Mock<HttpContextBase>();
    

ただし、以下の UnityAutoMoqContainer への呼び出しは例外をスローします。

        var mock = container.GetMock<HttpContextBase>();

依存関係の解決に失敗しました。タイプ = "System.Web.HttpContextBase"、名前 = "(none)"。例外が発生しました: 解決中。例外: InvalidOperationException - 型 HttpContextBase を構築できません。この値を提供するようにコンテナーを構成する必要があります。

問題は、コンテナがモックされた抽象型を返すのを容易にしないのはなぜですか?

4

1 に答える 1

1

AreSame メソッドは、同じオブジェクトが両方の引数によって参照されていることをテストします。あなたがするとき

var serviceMock = new Mock<IService>();
var getMock = container.GetMock<IService>();
Assert.AreSame(getMock, serviceMock);

2 つの異なるオブジェクトを作成しても、それらが同じ参照になることはありません。コンテナーを使用せずに作成したインスタンスを automock コンテナーが知る方法はありません。ただし、これは成功します。

var mock1 = container.GetMock<IService>();
var mock2 = container.GetMock<IService>();
Assert.AreSame(mock1, mock2);

抽象型からモックを作成できないのはバグですが、今すぐ修正する必要があります。v2.1.0 に更新すると、期待どおりに動作するはずです。

お役に立てれば!

-トーマス

于 2011-09-03T13:32:38.803 に答える