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);

    }