C# 单元测试和测试

C# 单元测试和测试,c#,unit-testing,moq,C#,Unit Testing,Moq,我的应用程序能够更新项目。我想为此创建一个单元测试 这是在c#中使用最小起订量。当我在mock中调用setup方法时。我让它采取一个现有的项目,然后根据需要更新它 messageMock.Setup(m => m.SaveMessage(It.IsAny<Message>())) .Callback((Message msg) => { var oldMsg = _messages.FirstOrDefault(m => m.Id ==

我的应用程序能够更新项目。我想为此创建一个单元测试

这是在c#中使用最小起订量。当我在mock中调用setup方法时。我让它采取一个现有的项目,然后根据需要更新它

messageMock.Setup(m => m.SaveMessage(It.IsAny<Message>()))
           .Callback((Message msg) =>
{
    var oldMsg = _messages.FirstOrDefault(m => m.Id == msg.MessageID);
    if (oldMsg != null)
    {
        oldMsg.Description = msg.Description;
        oldMsg.IsActive = msg.IsActive;
        oldMsg.Name = msg.Name;
        oldMsg.Type = msg.Type;
    }
}).Verifiable();

如果更新项目的逻辑是在Moq中完成的,那么我只是在测试测试。如何测试更新功能的业务逻辑?

在我看来,您的问题没有直接的答案

您的问题是,您的消息类违反了正弦责任原则——要么在一个类中一次执行多个操作(执行验证、保存到数据库等),要么通过紧密耦合

单元测试不能很好地处理这种代码。为了能够对save方法进行单元测试,您需要将所有方面提取到单独的单元(例如类)中,然后单独测试它们

这样,您将得到一个用于验证的类、一个用于实际保存的类、域对象等等。然后将这些类组合在一起,形成整个对象


现在,您可以单独测试这些类中的每一个,您可能会发现,唯一需要模仿的就是实际的编写过程

在我看来,你的问题没有直接的答案

您的问题是,您的消息类违反了正弦责任原则——要么在一个类中一次执行多个操作(执行验证、保存到数据库等),要么通过紧密耦合

单元测试不能很好地处理这种代码。为了能够对save方法进行单元测试,您需要将所有方面提取到单独的单元(例如类)中,然后单独测试它们

这样,您将得到一个用于验证的类、一个用于实际保存的类、域对象等等。然后将这些类组合在一起,形成整个对象


现在,您可以单独测试这些类中的每一个,您可能会发现,唯一需要模仿的就是实际的编写过程

发布您要测试的方法的代码@user721146我将该方法添加到您的问题中,但是该方法看起来像是您想要模拟的方法,而不是您想要测试的方法;在这种情况下,您希望模拟
消息传递所引用的任何对象。发布要测试的方法的代码@user721146我将该方法添加到您的问题中,但是该方法看起来像是您想要模拟的方法,而不是您想要测试的方法;在本例中,您希望模拟
消息传递所引用的任何对象。消息类仅保存上述源代码中的消息传递。saveChanges()实际上只保存消息传递。其余的可能是您想要测试的业务逻辑,对吗?@Matthis Huttar-yes接下来的方法是将所有其他行移到一个新类,该类负责在持久化之前“接触”消息,然后为该类编写测试。这是有意义的。然后我会为持久性类创建一个接口吗?然后在我的测试中模拟持久性类?消息类只保存在上面的源代码中,实际上只保存Messaging.saveChanges()。其余的可能是您想要测试的业务逻辑,对吗?@Matthis Huttar-yes接下来的方法是将所有其他行移到一个新类,该类负责在持久化之前“接触”消息,然后为该类编写测试。这是有意义的。然后我会为持久性类创建一个接口吗?然后在我的测试中模拟持久性类?
public void SaveMessage(Message message) 
{ 
    var windowsIdentity = WindowsIdentity.GetCurrent(); 
    message.ModifiedBy = windowsIdentity != null ? 
                         windowsIdentity.Name : 
                         string.Empty; 
    message.ModifyDate = DateTime.Now; 
    Messaging.Entry(message).State = EntityState.Modified;        
    Messaging.SaveChanges(); 
}