C#ASP.Net MVC-单元测试断言方法失败
下面是我正在测试的程序的简要说明。该程序是一个小应用程序,用于注册运动员在各种田径比赛中的成绩记录。现在我正在测试创建新会议“CreateMete”选项的功能。每场比赛都有不同类型的项目:田径、标枪等。。。它发生在特定的时间和地点 我编写了一个小的测试函数,它允许我测试在数据库中创建一个新的会议,到目前为止,测试失败了,因为根据测试结果,问题出在我的Assert函数中。我确信它会起作用,但我想不会。测试失败错误告诉我:C#ASP.Net MVC-单元测试断言方法失败,c#,asp.net-mvc,unit-testing,C#,Asp.net Mvc,Unit Testing,下面是我正在测试的程序的简要说明。该程序是一个小应用程序,用于注册运动员在各种田径比赛中的成绩记录。现在我正在测试创建新会议“CreateMete”选项的功能。每场比赛都有不同类型的项目:田径、标枪等。。。它发生在特定的时间和地点 我编写了一个小的测试函数,它允许我测试在数据库中创建一个新的会议,到目前为止,测试失败了,因为根据测试结果,问题出在我的Assert函数中。我确信它会起作用,但我想不会。测试失败错误告诉我: Test Failed - CreateMeet Message: Asse
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,并且您期望的所有属性都匹配。看看流畅的断言,当涉及断言时,它可以让事情变得更简单
此外,由于您提到的是“单元测试”,您应该考虑