【问题标题】:Assert.AreEqual failed during unit test单元测试期间 Assert.AreEqual 失败
【发布时间】:2023-04-07 02:29:01
【问题描述】:

我正在为我正在处理的一个简单的控制台游戏项目运行以下测试,该项目因 Assert.AreEqual 失败而失败。

[TestMethod]
    public void TestMethod1()
    {
        //Arrange
        CommandInterpreter interpreter = new CommandInterpreter(new List<IDungeonObject>());
        CommandAction commandAction = new CommandAction(CommandEnum.GoNorth, null);
        const string north = "Go North";
        var expected = commandAction; 

        //Act
        var ogbjecUndertest = interpreter.Translate(north);

        //Assert
        Assert.AreEqual(expected, ogbjecUndertest);

    }

基本上,测试将一个字符串(在本例中为北)传递给 Translate(north) 方法,然后调用以下代码并根据字符串返回一个 Enum。

public CommandAction Translate(string issuedCommand) // <-- Go North
    {
        if (issuedCommand.IndexOf(' ') == -1)
            throw new InvalidCommandException("No command entered");

        if (issuedCommand.Equals("Go South", StringComparison.OrdinalIgnoreCase))
            return new CommandAction(CommandEnum.GoSouth, null);

        if (issuedCommand.Equals("Go North", StringComparison.OrdinalIgnoreCase))
            return new CommandAction(CommandEnum.GoNorth, null);

        return null;

该方法接受的CommandAction类

 public class CommandAction
{
   #region Properites

   /// <summary>
   /// Defines a valid commands
   /// </summary>
   public CommandEnum Command { get; private set; }

   /// <summary>
   /// Defines a dungeon object
   /// </summary>
   public IDungeonObject RelatedObject { get; private set; }

   #endregion

   #region Constructor

   /// <summary>
   /// User input action passed in by the dugeon controller 
   /// </summary>
   /// <param name="command"></param>
   /// <param name="dungeonObject"></param>
   public CommandAction(CommandEnum command, IDungeonObject dungeonObject)
   {
       Command = command;
       RelatedObject = dungeonObject;
   }

   #endregion

}

当我调试测试时,Assert 预期将我的 2 个 CommandAction 属性显示为;命令:GoNorth 和 RelatedObject null

我的测试对象显示为;命令:GoNorth 和 RelatedObject:null

所以我的值看起来是正确的,但我不知道为什么测试失败了?

【问题讨论】:

标签: c# unit-testing


【解决方案1】:

您的CommandAction 类型没有自定义.Equals(),因此AreEqual() 正在expected 对象和Translate 中创建的新对象之间进行参考比较。它们是不同的实例,因此不相等。测试正确失败。

【讨论】:

    【解决方案2】:

    方法返回的对象不是同一个对象。

    检查是在做参考比较,并正确地告诉你它不是同一个对象。

    【讨论】:

      【解决方案3】:

      您的expected CommandAction 不为空,但Translate 正在返回null

      也许您的意思是从Translate 返回一个CommandAction

      【讨论】:

        【解决方案4】:

        CommandAction 是一个引用类型。除非您覆盖 Equals 方法 Assert.AreEqual 将检查引用相等。由于您在方法内使用 new 关键字创建实例,因此它们将不一样。

        如果你不想仅仅为了单元测试而实现相等,你可以检查属性的值。

        Assert.AreEqual(CommandEnum.GoNorth, ogbjecUndertest.Command);
        Assert.IsNull(ogbjecUndertest.RelatedObject);
        

        如果你可以使用Fluent Assertions,ShouldBeEquivalentTo() 方法可以完成这项工作:

        ogbjecUndertest.ShouldBeEquivalentTo(expected);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-17
          • 1970-01-01
          • 2017-12-20
          • 1970-01-01
          • 2014-03-29
          • 1970-01-01
          • 2013-10-23
          • 1970-01-01
          相关资源
          最近更新 更多