1

インターフェイスの実装で使用されているイベントが、モックしているインターフェイスに表示されない場合に、moqを使用してイベントを単体テストで発生させる方法はありますか?

注:私のインターフェースはUIとは何の関係もなく、イベントはUI通知にのみ使用されるため、リポジトリはクライアント/ UIとは別のライブラリにあるため、実際のインターフェースからその動作を切り離したいと思いました。

例えば:

    [Test]
    public void TestRaiseBarProcessed()
    {
        ManualResetEvent barProcessedEvent = new ManualResetEvent(false);
        bool called = false;

        //Arrange
        Mock<IFooRepository> mockFooRepository = new Mock<IFooRepository>();

        mockSourceRepository
            .Setup(a => a.SearchForBar(barsToFind))
            .Returns(barsFound)
            .Raises(
                a => a.BarProcessed += null, 
                new BarFoundEventArgs(It.IsAny<string>()));

        IList<IFooRepository> mockFooRepositories = 
            new List<IFooRepository>();

        mockFooRepositories.Add(mockFooRepository.Object);

        FooBar fooBar = new FooBar(mockFooRepositories, FooList);

        fooBar.CurrentBarBeingProcessedInfo += (sender, e) =>
            {
                barProcessedEvent.Set();
                called = true;
            };

        //Act
        fooBar.CallFooRepositoryMethod();

        barProcessedEvent.WaitOne(25, false);

        //Assert
        mockFooRepository.Verify(
            a => a.SearchForBar(barsToFind),
            Times.Once());

        Assert.AreEqual(true, called);
    }

これについてさらに説明が必要な場合はお知らせください。

4

1 に答える 1

0

そのUIのみのイベントを別のインターフェースで定義し、両方を実装することを検討しましたか?その場合、Moqのマルチインターフェースモックを使用できます。

var fooRepositoryMock = new Mock<IFooRepository>();
var barUiEventMock = fooRepositoryMock.As<IBarUiEvent>();
bool wasCalled = false;
barUiEventMock.Object.BarProcessed += (s, e) => wasCalled = true;

fooRepositoryMock
    .Setup(m => m.SearchForBars(barsToFind))
    .Returns(barsFound)
    .Raises(
        foo => barUiEventMock.Object.BarProcessed += null,
        new BarFoundEventArgs("")
    );

// ...

Assert.That(wasCalled, Is.True);

toを呼び出すと、渡した引数を使用してイベントがSearchForBars発生します。BarProcessed

于 2012-09-26T15:41:33.993 に答える