4

ICreateService依存するクラスがありITicketApiAdapterます。匿名の作成サービスを作成するときに挿入されるように、モックの ITicketAdaper を登録しようとしました。

したがって、セットアップでは、チケットアダプター用に次のレジスタを用意しています。

Fixture.Register(() =>
    {
        var ticketApiAdapter = new Mock<ITicketApiAdapter>();
        ticketApiAdapter
            .Setup( x => x.AddTicketComment(
                It.IsAny<User>(), 
                It.IsAny<Customer>(), 
                It.IsAny<TicketComment>()))
        .Returns(new SaveResult
                        {
                            Success = true, 
                            Id = Fixture.CreateAnonymous<Guid>().ToString()
                        });

        return ticketApiAdapter;
    });

Fixture.Register(() => new CreateService(Fixture.CreateAnonymous<Mock<ITicketApiAdapter>>().Object));

ICreateService私の理解では、これはとの両方を「フリーズ」する必要があるMock<ITicketApiAdapter>ため、匿名インスタンスを要求すると、それが登録したインスタンスになります。

次のようなテストがあります。

[TestMethod]
public void CreateServiceCallsAddTicketComment()
{
    var apiTicketAdapter = Fixture.CreateAnonymous<Mock<ITicketApiAdapter>>();
    var createTicketRequest = Fixture.CreateAnonymous<CreateTicketComment>();
    var createService = Fixture.CreateAnonymous<CreateService>();

    var results = createService.CreateTicketComment(createTicketRequest);

    apiTicketAdapter
        .Verify(x => x.AddTicketComment(
            It.IsAny<User>(), 
            It.IsAny<Customer>(), 
            It.IsAny<TicketComment>()), 
        Times.Once());

    Assert.IsTrue(results.All(x => x.Success));
    Assert.IsTrue(results.All(x => x.Errors.Count == 0));

}

メソッドが呼び出されたことを確認できるように、登録したのは apiTicketAdapter であることを期待しています。ステップスルーすると、TicketApiAdapter が呼び出されますが、Moq は呼び出されなかったと言っています。

編集

これは私が得るエラーです:

CreateServiceCallsAddTicketComment が例外をスローしました: Moq.MockException: モックでの呼び出しが 1 回期待されましたが、0 回でした: x => x.AddTicketComment(It.IsAny(), It.IsAny(), It.IsAny())

構成されたセットアップ: x => x.AddTicketComment(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never 呼び出しは実行されませんでした。

4

1 に答える 1

5

コードブロックを登録すると、Fixtureインスタンスが要求されたタイプを解決するたびに、そのコードブロックが呼び出されます。これは、凍結されていないことを意味します。何かをフリーズしたい場合は、フリーズオーバーロードの1つを使用する方が簡単なことがよくあります。

さらに良いことに、Moqを使用しているようですが、AutoMoq拡張機能の使用をお勧めしますか?

これにより、テストを次のように書き直すことができます。

[TestMethod]
public void CreateServiceCallsAddTicketComment(new AutoMoqCustomization());
{
    var fixture = new Fixture().Customize()
    var apiTicketAdapter = fixture.Freeze<Mock<ITicketApiAdapter>>();
    ticketApiAdapter
        .Setup( x => x.AddTicketComment(
            It.IsAny<User>(), 
            It.IsAny<Customer>(), 
            It.IsAny<TicketComment>()))
        .Returns(new SaveResult
        {
            Success = true, 
            Id = Fixture.CreateAnonymous<Guid>().ToString()
        });

    var createTicketRequest = fixture.Freeze<CreateTicketComment>();
    var createService = fixture.CreateAnonymous<CreateService>();

    var results = createService.CreateTicketComment(createTicketRequest);

    apiTicketAdapter
        .Verify(x => x.AddTicketComment(
            It.IsAny<User>(), 
            It.IsAny<Customer>(), 
            It.IsAny<TicketComment>()), 
        Times.Once());

    Assert.IsTrue(results.All(x => x.Success));
    Assert.IsTrue(results.All(x => x.Errors.Count == 0));

}

これは、CreateTicketRequestがコンストラクタインジェクションまたはプロパティインジェクションを使用することを前提としています。

于 2011-11-09T20:07:35.497 に答える