Юнит тест не проходит, почему? - PullRequest
0 голосов
/ 31 января 2019

Я начинающий студент C #, и у меня есть задание со следующими инструкциями.Я предоставил их КАК ХОРОШО, КАК мой код для классов, которые я создал, просто чтобы вы могли иметь некоторый контекст и видеть, все ли я сделал правильно

https://imgur.com/a/Ce04tyK

IЯ пытался создать два объекта и сравнить их с методом 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 голосов
/ 31 января 2019

Первый: в вашем утверждении вы сравниваете два BankAccounts через Ссылочное равенство , пока вы не реализуете IEquatable и переопределяете Equals (object obj)).Таким образом, у вас есть два основных варианта:

1) Проверить каждое сопоставимое свойство (например, int, string, ...) и написать для него утверждение.Например:

Assert.AreEqual(account.Owner.FirstName, account2.Owner.FirstName);
Assert.AreEqual(account.Owner.LastName, account2.Owner.LastName);
Assert.AreEqual(account.Balance, account2.Balance);

2) Реализуйте интерфейс IEquatable - и / или переопределите Equals (объект obj), чтобы сделать сравнение на равенство работой самого BankAccount.

Assert.AreEqual(o1,o2); //basically calls 
o1.Equals(o2);

Чтобы сравнить их на равенство, вам необходимо как минимум переопределить метод Equals (object obj).

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;
  }
}

Второе: ваш тест все равно не пройден, посколькуу вас там разные ценности.Таким образом, для успешной работы Assert.AreEqual (o1, o2) вам придется поместить туда одинаковые значения.

Преимущество первого подхода состоит в том, что он точно покажет вам, где находятся две учетные записи.отличается, в то время как другой просто указывает, что они разные, используя ToString ().

В вашем случае у вас будет необходимая информация из-за переопределения ToString (), но я бы предпочел первый, если вам все равно не нужно переопределять метод Equals.

0 голосов
/ 31 января 2019

Объяснение @ 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);
}

Надеюсь, этот ответ поможет вам.

0 голосов
/ 31 января 2019

Несколько вещей здесь не так.Во-первых, вы выполняете сравнительное сравнение (если только BankAccount не реализует IComparable или IEquatable, в чем я серьезно сомневаюсь).По сути, у вас есть два адреса памяти для двух разных объектов, и, конечно, они не равны.

Тогда, даже если вы реализовали IComparable, IEquatable или IEqualityComparer, учетные записи неТ выглядит равнымОни для двух разных людей.С представленным материалом я не ожидаю, что этот тест пройдёт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...