[英]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.