簡體   English   中英

使用Moq測試界面中沒有的事件

[英]Using Moq to test events that are not in an interface

如果在接口實現中使用的事件未出現在您要嘲笑的接口中,是否可以通過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);
    }

讓我知道是否需要進一步澄清。

您是否考慮過在另一個界面中定義僅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);

調用SearchForBars會使您傳遞的任何參數引發BarProcessed事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM