Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#ASP.Net MVC-单元测试断言方法失败_C#_Asp.net Mvc_Unit Testing - Fatal编程技术网

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

C#ASP.Net MVC-单元测试断言方法失败,c#,asp.net-mvc,unit-testing,C#,Asp.net Mvc,Unit Testing,下面是我正在测试的程序的简要说明。该程序是一个小应用程序,用于注册运动员在各种田径比赛中的成绩记录。现在我正在测试创建新会议“CreateMete”选项的功能。每场比赛都有不同类型的项目:田径、标枪等。。。它发生在特定的时间和地点 我编写了一个小的测试函数,它允许我测试在数据库中创建一个新的会议,到目前为止,测试失败了,因为根据测试结果,问题出在我的Assert函数中。我确信它会起作用,但我想不会。测试失败错误告诉我: Test Failed - CreateMeet Message: Asse

下面是我正在测试的程序的简要说明。该程序是一个小应用程序,用于注册运动员在各种田径比赛中的成绩记录。现在我正在测试创建新会议“CreateMete”选项的功能。每场比赛都有不同类型的项目:田径、标枪等。。。它发生在特定的时间和地点

我编写了一个小的测试函数,它允许我测试在数据库中创建一个新的会议,到目前为止,测试失败了,因为根据测试结果,问题出在我的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));

    }
public void CreateMeet()
{
var createMeet=new Meet()
{
MeetId=1234,
MeetName=春季聚会,
MeetDate=日期时间。现在,
MeetLocation=“法国巴黎”,
MeasurementType=“公制”
};
var MeetController=新的MeetController();
MeetController.AddMeet(createMeet);
var testList=新列表(MeetController.RetrieveAllMeets());
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;
        }
公共IList RetrieveAllMeets()
{
JObject jsonMeetObj=JObject.Parse(FieldScribeAPIRequests.FieldScribeGETAsync(FieldScribeAPIRequests.FieldScribeAPIRootAddress+“满足”);
IList results=jsonMeetObj[“value”].Children().ToList();
IList meets=新列表();
foreach(结果中的JToken项)
meets.Add(item.ToObject());
返回会议;
}

我相信您在比较实例,当您想要比较值时

简单地说,对象“CreateMete”与“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语句失败,您将不会看到“不应该发生”,但第二个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);
    }
}

我相信你是在比较实例,当你想比较价值的时候

简单地说,对象“CreateMete”与“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语句失败,您将不会看到“不应该发生”,但第二个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);
    }
}

根据您的问题,您可能希望比较
Meet
类中对象的字段

列表中包含
方法,该方法将通过
等于
方法检查对象是否存在

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

Meet
是一种引用类型,当您使用
Contains
方法时,将比较对象的指针

一种简单的方法,可以在
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();
    }
}

根据您的问题,您可能希望比较
Meet
类中对象的字段

列表中包含
方法,该方法将通过
等于
方法检查对象是否存在

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

Meet
是一种引用类型,当您使用
Contains
方法时,将比较对象的指针

一种简单的方法,可以在
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();
    }
}

因为您正在使用Id存储会议,而不是检索所有会议和 检查集合是否包含meet,编写一个方法以通过meet id获取meet。断言它返回一个meet,并且您期望的所有属性都匹配。看看流畅的断言,当涉及断言时,它可以让事情变得更简单


此外,由于你提到的是“单元测试”,你应该考虑嘲笑来创建一个内存中的集合,并对它们进行测试,而不是对数据库进行测试。p> 因为您正在使用Id存储会议,而不是检索所有会议和 检查集合是否包含meet,编写一个方法以通过meet id获取meet。断言它返回一个meet,并且您期望的所有属性都匹配。看看流畅的断言,当涉及断言时,它可以让事情变得更简单

此外,由于您提到的是“单元测试”,您应该考虑