【问题标题】:Unit tests and testing the test单元测试和测试测试
【发布时间】:2015-07-30 20:05:25
【问题描述】:

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

这是在 c# 中使用 Moq。当我在模拟中调用 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();

而被测方法是:

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

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

【问题讨论】:

  • 贴出你要测试的方法的代码!
  • @user721146 我将方法添加到您的问题中,但是该方法看起来像您要mock 的方法,而不是您要测试的方法。
  • 你应该模拟你的被测类正在调用的对象;在这种情况下,您想模拟 Messaging 引用的任何对象。

标签: c# unit-testing moq


【解决方案1】:

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

您的问题是您的消息类违反了正弦责任原则——要么在一个类中同时做几件事(执行验证、保存到数据库……),要么通过紧密耦合。

单元测试不适用于这种代码。为了能够对您的保存方法进行单元测试,您需要将所有方面提取到单独的单元(例如类)中,然后单独测试它们。

这样你最终会得到一个用于验证的类,一个用于实际保存的类,你的域对象等等。然后将这些类组合在一起以形成整个事物。

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

【讨论】:

  • 消息类只保存
  • 在上面的源代码中,只有 Messaging.saveChanges() 确实保存了。其余的可能是您想要测试的业务逻辑,对吧?
  • @Matthis Huttar - 是的
  • 那么要走的路是将所有其他行移动到一个新类,该类负责在持久化之前“触摸”消息,然后为该类编写一个测试。
  • 这是有道理的。然后我会为持久类创建一个接口吗?然后在我的测试中模拟持久性类?
猜你喜欢
  • 2014-03-20
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 2011-12-02
相关资源
最近更新 更多