C#ASP.Net MVC - 单元测试断言方法失败

问题描述 投票:0回答:3

所以关于我正在测试的程序的快速概述。该程序是一个小应用程序,记录运动员的各种赛道记录。现在我正在测试该选项的功能,以创建一个新的会议“CreateMeet”。每次见面都有不同类型的赛事:赛道,标枪等......它发生在特定的时间和地点。

我写了一个小的测试函数,它允许我测试在数据库中创建一个新的meet,到目前为止测试失败了,因为根据测试结果,问题出在我的Assert函数中。我确信它会起作用,但我猜它没有。测试失败错误给了我这个:

Test Failed - CreateMeet
Message: Assert.IsTrue failed. 

以下是测试功能:

public void CreateMeet()
    {
        var createMeet = new Meet()
        {
            MeetId = 1234,
            MeetName = Spring Meet,
            MeetDate = DateTime.Now,
            MeetLocation = "Paris, France",
            MeasurementType = "Metric"
        };

        var MeetController = new MeetsController();

        MeetController.AddMeet(createMeet);

        var testList = new List<Meet>(MeetController.RetrieveAllMeets());

        Assert.IsTrue(testList.Contains(createMeet));

    }

您认为我可能需要哪种断言或哪种类型的函数才能生成成功的测试?我对任何其他选择感到难过。感谢您的意见。

根据D-Shih的要求更新附加代码。

public IList<Meet> RetrieveAllMeets()
        {
            JObject jsonMeetObj = JObject.Parse(FieldScribeAPIRequests.FieldScribeGETAsync(FieldScribeAPIRequests.FieldScribeAPIRootAddress + "meets"));

            IList<JToken> results = jsonMeetObj["value"].Children().ToList();

            IList<Meet> meets = new List<Meet>();

            foreach (JToken item in results)
                meets.Add(item.ToObject<Meet>());

            return meets;
        }
c# asp.net-mvc unit-testing
3个回答
1
投票

当你想要比较值时,我相信你正在比较实例。

简而言之,对象'createMeet'与'testList'中的对象不同 - 它们属于同一类,并且它们具有相同的数据值,但它们不是对象的同一实例。

为了让它做你想做的事,你可以在你的DTO上构建一个比较所有字段值的CompareTo(Meet)方法,并返回一个true / false,表示对象是'数据等价'。

- 编辑:更多信息。

考虑以下课程

public class DTO
{
    public int Value;

    public bool CompareTo(DTO Target)
    {
        return (Target.Value == Value);
    }
}

现在,请考虑以下代码:

private void button1_Click(object sender, EventArgs e)
{
    DTO a = new DTO();
    DTO b = new DTO();

    a.Value = 1;
    b.Value = 1;

    if (a == b)
        MessageBox.Show("Should not happen");

    if (a.CompareTo(b))
        MessageBox.Show("Should happen");
}

变量a和b是数据等价物;他们的意思是一样的。但它们不是对象的同一个实例。所以,第一个if语句失败了,你不会看到“不应该发生”,但第二个如果通过,你会看到“应该发生”。

您可以覆盖==运算符,如下所示,但我不推荐它:

public class DTO
{
    public int Value;

    public bool CompareTo(DTO Target)
    {
        return (Target.Value == Value);
    }

    public static bool operator ==(DTO a, DTO b)
    {
        return (a.Value == b.Value);
    }

    public static bool operator !=(DTO a, DTO b)
    {
        return (a.Value != b.Value);
    }
}

1
投票

根据您的问题,您可能希望比较来自Meet Class的对象字段。

Contain中的List方法将通过Equals方法检查对象。

此方法通过使用默认的相等比较器来确定相等性,由对象的T的IEquatable.Equals方法的实现(列表中的值的类型)定义。

Meet是一个引用类型,当你使用Contains方法时会比较对象的指针。

override Equals(object obj)上做Meet的简单方法

public class Meet
{
    public int MeetId { get; set; }
    public string MeetName { get; set; }
    public DateTime MeetDate { get; set; }
    public string MeetLocation { get; set; }
    public string MeasurementType { get; set; }

    public override bool Equals(object obj)
    {
        Meet input = obj as Meet;

        if (obj==null)
            return false;

        return MeetId == input.MeetId &&
               MeetName == input.MeetName &&
               MeetDate == input.MeetDate &&
               MeetLocation == input.MeetLocation &&
               MeasurementType == input.MeasurementType;
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }
}

1
投票

由于您正在使用With Id存储会话,而不是检索所有会议并检查集合是否包含会议,因此请编写一个方法以通过meet id进行会议。断言它返回一个符号,并且您期望的所有属性都匹配。看一下流畅的断言,这可以让你在断言时更简单。 http://fluentassertions.com/

另外,既然你提到的是“单元测试”,你应该考虑使用mock来创建一种内存中的集合并对它们进行测试而不是对数据库进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.