单元测试未通过,为什么?

时间:2019-01-30 21:52:44

标签: c# unit-testing

我是C#的初学者,我根据以下说明进行作业。我已经为我创建的类提供了同样好的代码,以便您可以了解一些上下文并查看我是否做对了所有

https://imgur.com/a/Ce04tyK

我一直在尝试创建两个对象,并将它们与单元测试中的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);
    }
}

我在做什么错,如何解决?很抱歉,这是一个愚蠢的问题,但是就像我说的那样,我是编程新手。

3 个答案:

答案 0 :(得分:2)

这里有些错误。第一个是您正在执行参考比较(除非BankAccount实现IComparableIEquatable,我对此表示严重怀疑)。基本上,您有两个用于两个不同对象的内存地址,它们当然是不相等的。

然后,即使您实施了IComparableIEquatableIEqualityComparer,这些帐户的外观甚至都不相等。他们是给两个不同的人的。在介绍了材料的情况下,我不希望该测试通过。

答案 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);
}

希望这个答案对您有所帮助。