C# Затуп с UnitTest
делаю практическую работу на C# (пользуюсь им первый раз в жизни и именно поэтому прошу помощи тут) с помощью "методички" от колледжа, появилась проблема, делаю все так же как в "методичке", но тест не проходит, почему - не знаю, помогите пожалуйста.
По методичке допущена ошибка, которую необходимо исправить, но даже после ее исправления тест не проходит
(На скринах ошибка уже исправлена)
Debit_WithValidAmount_UpdatesBalance
Источник: BankAccountTests.cs строка 11
Длительность: 127 мс
Сообщение:
Сбой Assert.AreEqual. Между ожидаемым значением <7,44> и фактическим значением <11,99> требуется разница не более чем <0,001>. Account not debited correctly
Трассировка стека:
BankAccountTests.Debit_WithValidAmount_UpdatesBalance() строка 18
Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException: "Сбой Assert.AreEqual. Между ожидаемым значением <7,44> и фактическим значением <11,99> требуется разница не более чем <0,001>. Account not debited correctly"
Задание:(Ниже все из "методички", текст может быть кривой т.к она в PDF формате)
1. Создать новый проект BankAccountNS для тестирования в Библиотеки классов.
Код проекта:
using System;
namespace BankAccountNS
{ public class BankAccount
{ private readonly string m_customerName; private double m_balance;
private BankAccount() { }
public BankAccount(string customerName, double balance)
{ m_customerName = customerName; m_balance = balance;}
public string CustomerName
{get { return m_customerName; }} public double Balance
{get { return m_balance; }} public void Debit(double amount)
{if (amount > m_balance)
{throw new ArgumentOutOfRangeException("amount");} if (amount < 0)
{throw new ArgumentOutOfRangeException("amount");} m_balance += amount; //
intentionally incorrect code} public void Credit(double amount)
{if (amount < 0)
{throw new ArgumentOutOfRangeException("amount");} m_balance += amount;}
public static void Main()
{BankAccount ba = new BankAccount("Mr. Bryan Walton", 11.99); ba.Credit(5.77);
ba.Debit(11.22);
Console.WriteLine("Current balance is ${0}", ba.Balance
Провести тестирование на примере метода Debit. Метод Debit вызывается, когда денежные средства снимаются со счета. Определение метода Debit имеет вид:
public void Debit(double amount)
{ if(amount > m_balance) { throw new ArgumentOutOfRangeException(«amount»); } if
(amount < 0) { throw new ArgumentOutOfRangeException(«amount»); } m_balance +=
amount; }
2 Создать новый проект BankAccountNS для тестирования в Библиотеки классов. Код проекта:
1 Создать тест, который проверяет, снимается ли со счета нужная сумма при допустимом размере кредита (со значением меньшим, чем баланс счета, и большим, чем ноль). Добавьте следующий метод в этот класс BankAccountTests :
[TestMethod]
public void Debit_WithValidAmount_UpdatesBalance()
{
// Arrange
double beginningBalance = 11.99; double debitAmount = 4.55; double expected = 7.44;
BankAccount account = new BankAccount(«Mr. Bryan Walton», beginningBalance);
// Act account.Debit(debitAmount);
// Assert
double actual = account.Balance; Assert.AreEqual(expected, actual, 0.001, «Account not
debited correctly»);
}
Исправление ошибки по методичке
Результат теста содержит сообщение, описывающее возникшую ошибку. Для метода AreEqual сообщение отражает ожидаемый результат (параметр Ожидается) и фактически полученный (параметр Фактическое). Ожидалось, что баланс уменьшится, а вместо этого он увеличился на сумму списания. Модульный тест обнаружил ошибку: сумма списания добавляется на баланс счета, вместо того чтобы вычитаться.
Исправление ошибки. Для исправления ошибки замените строку:
m_balance+= amount;
на:
m_balance -= amount; (у меня все так же)
Мой код:
Обозреватель решений:
BankAccount.cs:
using System;
namespace BankAccountNS
{
public class BankAccount
{
private readonly string m_customerName; private double m_balance;
private BankAccount() { }
public BankAccount(string customerName, double balance)
{ m_customerName = customerName; m_balance = balance; }
public string CustomerName
{ get { return m_customerName; } }
public double Balance
{ get { return m_balance; } }
public void Debit(double amount)
{
if (amount > m_balance)
{
throw new ArgumentOutOfRangeException("amount");
}
if (amount < 0)
{
throw new ArgumentOutOfRangeException("amount");
}
m_balance -= amount;
}
public void Credit(double amount)
{
if (amount < 0)
{ throw new ArgumentOutOfRangeException("amount"); }
m_balance += amount;
}
public static void Main()
{
BankAccount ba = new BankAccount("Mr. Bryan Walton", 11.99); ba.Credit(5.77);
ba.Debit(11.22);
Console.WriteLine("Current balance is ${0}", ba.Balance);
}
}
}
BankAccountTests.cs:
using BankAccountNS;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Security.Principal;
namespace BankTests
{
[TestClass]
public class BankAccountTests
{
[TestMethod]
public void Debit_WithValidAmount_UpdatesBalance()
{
// Arrange
double beginningBalance = 11.99; double debitAmount = 4.55; double expected = 7.44;
BankAccount account = new BankAccount("Mr.Bryan Walton", beginningBalance);
// Act account.Debit(debitAmount);
// Assert
double actual = account.Balance; Assert.AreEqual(expected, actual, 0.001, "Account not debited correctly");
}
}
}
Я пользуюсь этим языком первый раз и можно сказать, что ничего не понимаю, но проект нужно сдать как можно быстрее. Помогите мне пожалуйста, спасибо.
Ответы (1 шт):
Решение от @EvgeniyZ
Заменить // Act account.Debit(debitAmount); на account.Debit(debitAmount);
using BankAccountNS;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Security.Principal;
namespace BankTests
{
[TestClass]
public class BankAccountTests
{
[TestMethod]
public void Debit_WithValidAmount_UpdatesBalance()
{
// Arrange
double beginningBalance = 11.99; double debitAmount = 4.55; double expected = 7.44;
BankAccount account = new BankAccount("Mr.Bryan Walton", beginningBalance);
account.Debit(debitAmount); // Из за кривого PDF формата было не понятно что тут должно быть именно так
// Assert
double actual = account.Balance; Assert.AreEqual(expected, actual, 0.001, "Account not debited correctly");
}
}
}