我是C#的初学者,我根据以下说明进行作业。我已经为我创建的类提供了同样好的代码,以便您可以了解一些上下文并查看我是否做对了所有
我一直在尝试创建两个对象,并将它们与单元测试中的Assert.AreEqual方法进行比较。但是,它一直在失败。这是我写的:
[TestClass]
public class UnitTest1
{
[TestMethod]
public void EmptyAccount()
{
//given
Person person = new Person("John", "Smith");
BankAccount account = new BankAccount(person, 0.00);
//when
Person person2 = new Person("Michael", "Johnson");
BankAccount account2 = new BankAccount(person2, 0.00);
//then
Assert.AreEqual(account, account2);
}
class Program
{
static void Main(string[] args)
{
}
}
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public override string ToString()
{
return FirstName+LastName;
}
}
public class BankAccount
{
public Person Owner
{ get; private set; }
public static double Balance
{ get; private set; }
public static double InterestRate
{ get; private set; }
public BankAccount (Person person, double balance)
{
Balance = balance;
Owner = person;
}
public static void Deposit(double deposit)
{
Balance += deposit;
}
public static void Withdrawal(double withdrawal)
{
Balance -= withdrawal;
}
public static void DepositInterest(double interestRate)
{
interestRate = InterestRate;
Balance += (Balance * InterestRate);
}
public override string ToString()
{
return string.Format("Your name is {0} and your balance is {1}", Owner, Balance);
}
}
我在做什么错,如何解决?很抱歉,这是一个愚蠢的问题,但是就像我说的那样,我是编程新手。
答案 0 :(得分:2)
这里有些错误。第一个是您正在执行参考比较(除非BankAccount
实现IComparable
或IEquatable
,我对此表示严重怀疑)。基本上,您有两个用于两个不同对象的内存地址,它们当然是不相等的。
然后,即使您实施了IComparable
,IEquatable
或IEqualityComparer
,这些帐户的外观甚至都不相等。他们是给两个不同的人的。在介绍了材料的情况下,我不希望该测试通过。
答案 1 :(得分:1)
优点:在您的断言中,只要您不实现Referential Equality并覆盖Equals(object obj),就通过IEquatable< BankAccount >比较两个BankAccounts。 因此,您基本上有两个选择:
1)测试每个可比较的属性(例如int,string等)本身,并为其编写一个断言。
例如:
Assert.AreEqual(o1,o2); //basically calls
o1.Equals(o2);
2)实现IEquatable-接口和/或重写Equals(object obj),以使相等性比较成为BankAccount本身的工作。
public class BankAccount
{
...
public override bool Equals(object obj)
{
if (!(obj is BankAccount)) return false;
var other = obj as BankAccount;
return this.Owner.FirstName == other.Owner.FirstName &&
this.Owner.LastName == other.Owner.LastName &&
this.Balance == other.Balance;
}
}
为了比较它们的相等性,您至少必须重写Equals(object obj)方法。
{{1}}
第二:由于其中有不同的值,因此测试仍将失败。因此,要使Assert.AreEqual(o1,o2)成功,您将必须在其中放置相同的值。
第一种方法的优点是,它将使用ToString()准确显示两个帐户不同的地方,而另一个帐户则指出它们不同。
在您的情况下,由于将覆盖ToString(),因此您将拥有所需的信息,但是,如果您仍然不需要覆盖Equals方法,那么我还是希望使用第一个。
答案 2 :(得分:1)
@ BradleyDotNet的解释完整地说明了为什么AreEqual
返回false
,然后您的测试失败。但我想说您能怎么解决您的问题。
在您的情况下,BackAcounts
的所有者是不同的,通常您会以false
方法获得AreEqual
,并且测试失败
要编写第一步的单元测试,您必须决定应该测试哪个单元,并且必须在心中定义一个方案。
例如,当帐户所有者要提款时,您必须检查某些条件(e.g. Account is Empty or not)
假定您使用名称为CanWithdraw
的方法检查这些条件
然后检查帐户是否为空,返回false
。
要测试这些情况,您可以编写此测试:
...
[TestMethod]
public void CanWithdraw_AccountIsEmpty_ReturnsFalse()
{
var person = new Person("John", "Smith");
var account = new BankAccount(person, 0.00);
var result = account.CanWithdraw();
Assert.IsFalse(result);
}
希望这个答案对您有所帮助。