C# 使用Moq设置事件聚合器事件
我试图对一个简单的方法进行单元测试,并验证该方法是否发布了某些事件,但发现很难设置模型C# 使用Moq设置事件聚合器事件,c#,.net,unit-testing,moq,caliburn.micro,C#,.net,Unit Testing,Moq,Caliburn.micro,我试图对一个简单的方法进行单元测试,并验证该方法是否发布了某些事件,但发现很难设置模型 //Class under test public class TreatmentRoomModel : ITreatmentRoomModel { public TreatmentRoomModel(IEventAggregator eventAggregator) { _eventAggregator = eventAggregator; }
//Class under test
public class TreatmentRoomModel : ITreatmentRoomModel
{
public TreatmentRoomModel(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
}
//Method under test
public void SetTreatmentInProgress(bool inProgress)
{
if (_isTreatmentInProgress == inProgress) return;
_isTreatmentInProgress = inProgress;
_eventAggregator.Publish(new TreatmentStatus(_isTreatmentInProgress), Execute.OnUIThread);
}
}
//TreatmentStatus event
public class TreatmentStatus
{
public TreatmentStatus(bool isInProgress)
{
IsInProgress = isInProgress;
}
public bool IsInProgress { get; private set; }
}
我正在尝试测试方法SetTreatmentInProgress
,并验证eventaggregator是否正在发布正确的TreatmentStatus
事件。
事件聚合器是typeof(Caliburn.Micro.IEventAggregator)
下面是测试设置
[TestClass]
public class TreatmentRoomModelTests
{
private Mock<IEventAggregator> _mockEventAggregator;
ITreatmentRoomModel _treatmentRoomModel;
private readonly TreatmentStatus _treatmentInProgressEvent = new TreatmentStatus(true);
private readonly TreatmentStatus _treatmentNotInProgressEvent = new TreatmentStatus(false);
[TestInitialize]
public void Initialize()
{
_mockEventAggregator = new Mock<IEventAggregator>();
//I am not sure how to set the property IsInProgress of TreatmentStatus to true? It is a privately set property through constructor.
_mockEventAggregator.Setup(x => x.Publish(It.IsAny<TreatmentStatus>(), Execute.OnUIThread));
//Or should I directly publish a true event, but then how to verify the event object without a reference to it.
//_mockEventAggregator.Setup(x => x.Publish(new TreatmentStatus(true), Execute.OnUIThread));
_treatmentRoomModel = new TreatmentRoomModel(_mockEventAggregator.Object);
}
[TestMethod]
public void SetTreatmentInProgressTest()
{
_treatmentRoomModel.SetTreatmentInProgress(true);
//This works, but I wan't to verify that the object of TreatmentStatus event has the property IsInProgress set to true.
_mockEventAggregator.Verify(x=>x.Publish(It.IsAny<TreatmentStatus>(), Execute.OnUIThread),Times.Once);
_treatmentRoomModel.SetTreatmentInProgress(false);
//Won't work, as it says this is getting called Times.None. I understand this may be because of different TreatmentStatus objects, which are raised and verified.
_mockEventAggregator.Verify(x=>x.Publish(new TreatmentStatus(false), Execute.OnUIThread),Times.Once);
}
}
[TestClass]
公共类处理RoomModelTests
{
私有Mock\u mockEventAggregator;
iTreactionRoomModel\u治疗室模型;
private readonly TreatmentStatus\u treatmentinprogressent=new TreatmentStatus(true);
private readonly TreatmentStatus\u treatmentnotinprogressent=新的TreatmentStatus(false);
[测试初始化]
公共无效初始化()
{
_mockEventAggregator=new Mock();
//我不知道如何将属性IsInProgress of TreatmentStatus设置为true?它是通过构造函数私人设置的属性。
_mockEventAggregator.Setup(x=>x.Publish(It.IsAny(),Execute.OnUIThread));
//或者我应该直接发布一个真实的事件,但是如何在没有引用的情况下验证事件对象呢。
//_mockEventAggregator.Setup(x=>x.Publish(newtreatmentstatus(true),Execute.OnUIThread));
_treatmentRoomModel=新的treatmentRoomModel(\u mockEventAggregator.Object);
}
[测试方法]
公共无效设置处理InProgressTest()
{
_treatmentRoomModel.SetTreatmentInProgress(真);
//这是可行的,但我不想验证TreatmentStatus事件的对象是否将属性IsInProgress设置为true。
_验证(x=>x.Publish(It.IsAny(),Execute.OnUIThread),Times.Once);
_treatmentRoomModel.SetTreatmentInProgress(假);
//不起作用,因为它说这是被调用的时间。没有。我理解这可能是因为不同的TreatmentStatus对象,它们被提出和验证。
_mockEventAggregator.Verify(x=>x.Publish(newtreatmentstatus(false)、Execute.OnUIThread)、Times.Once);
}
}
修复要使用的表达式
//这是可行的,但我不想验证TreatmentStatus事件的对象是否将属性IsInProgress设置为true。
_mockEventAggregator
.Verify(x=>x.Publish(It.Is(\u=>\ uIsInProgress==true)、Execute.OnUIThread)、Times.Once);
[TestMethod]
公共无效设置处理InProgressTest()
{
var inProgress=真;
TreatmentStatus resultStatus=null;
_mockEventAggregator.Setup(x=>x.Publish(It.IsAny(),Execute.OnUIThread))
.Callback((t,s)=>resultStatus=(TreatmentStatus)t);
_治疗室模型。设置治疗程序(inProgress);
Assert.IsNotNull(resultStatus);
Assert.IsTrue(resultStatus.IsInProgress);
Assert.IsTrue(_treatmentRoomModel.IsTreatmentInProgress);
}
谢谢你的回答,下面是我的看法,但你的回答很圆滑:)
//This works, but I wan't to verify that the object of TreatmentStatus event has the property IsInProgress set to true.
_mockEventAggregator
.Verify(x=>x.Publish(It.Is<TreatmentStatus>(_ => _.IsInProgress == true), Execute.OnUIThread),Times.Once);
[TestMethod]
public void SetTreatmentInProgressTest()
{
var inProgress = true;
TreatmentStatus resultStatus = null;
_mockEventAggregator.Setup(x => x.Publish(It.IsAny<TreatmentStatus>(), Execute.OnUIThread))
.Callback<object,Action<Action>>((t,s) => resultStatus = (TreatmentStatus)t);
_treatmentRoomModel.SetTreatmentInProgress(inProgress);
Assert.IsNotNull(resultStatus);
Assert.IsTrue(resultStatus.IsInProgress);
Assert.IsTrue(_treatmentRoomModel.IsTreatmentInProgress);
}