Ron23111 Ответов: 1

Не удается преобразовать тип bool в long


Я новичок в C# и пытаюсь создать класс банковского счета, а затем должен выполнить модульное тестирование этого класса. Ниже приведен мой класс, и я не уверен, почему я получаю неявно тип bool to long error в моем модульном тесте на

фактические = - банковские реквизиты.IsAccountNumberVerified(accountNumber);

Спасибо.

Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Project
{
    public class BankAccount
    {
        private double balance;
        private String accountHolderName;
        private long accountNumber;
        public const String WRONG_ACCOUNT_NUMBER = "Wrong account number generated";
        public const String WRONG_AMOUNT = "Cannot withdraw or deposit zero or negative amount.";
        public const String INSUFFICIENT_BALANCE = "Insufficient balance";


        public String AccountHolderName
        {
            get { return accountHolderName; }
        }

        public double Balance
        {
            get { return balance; }
        }

        public BankAccount(double initialBalance, string accountHolderName)
        {
            this.accountNumber = GetNewAccontNumber();
            this.balance = initialBalance;
            this.accountHolderName = accountHolderName;

        }



        private long GetNewAccontNumber()
        {
            Random rand = new Random();
            this.accountNumber = rand.Next(100000000, 1000000000);

            string accNumber = String.Format("32{0}", accountNumber.ToString("D6"));

            long aNum = Convert.ToInt64(accNumber);
            return aNum ;

            

        }

        public bool IsAccountNumberVerified(long accountNumber)
        {

            Boolean isVerified = true;
            String strValue = accountNumber.ToString();
            if (strValue.Length != 10)
                isVerified = false;

            if (strValue.Substring(0, 2) != "18")
                isVerified = false;
            return isVerified;

        }


    }
}



Модульная тестовая часть:
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Project;

namespace UnitTestProjectBankAccount
{
    [TestClass]
    public class UnitTestBankAccount
    {
        [TestMethod]
        public void ID_1_TestMethodIsAccountNumberVerified_BVAValidNumberMin()
        {
            //Arrange
            long accountNumber = 32186587;
            long expected = 32186587;

            //Act
            BankAccount bankAccount = new BankAccount(20.00, "Mr. Bryan Walton");
            bankAccount.IsAccountNumberVerified(accountNumber);
            long actual = bankAccount.IsAccountNumberVerified(accountNumber);


            // assert  
            Assert.AreEqual(expected, actual);

        }

    }
}

1 Ответов

Рейтинг:
0

Dave Kreskowiak

IsAccountNumberVerified возвращает логическое значение true или false.

Long-это 64-битное целое число, которое на самом деле не подходит для возвращаемого значения.

Ваш модульный тестовый код должен быть:

public void ID_1_TestMethodIsAccountNumberVerified_BVAValidNumberMin()
        {
            //Arrange
            long accountNumber = 32186587;
            bool expected = true;

            //Act
            BankAccount bankAccount = new BankAccount(20.00, "Mr. Bryan Walton");
            bool verified = bankAccount.IsAccountNumberVerified(accountNumber);

            // assert  
            Assert.AreEqual(verified, expected);
        }

Вы действительно не можете использовать номер счета в своем модульном тесте, потому что он генерируется случайным образом. Кроме того, генератор случайных чисел заполняется текущим временем создания случайного объекта, поэтому вы даже не можете надежно получить от него тот же номер счета.

Но этот тест будет провален с очень высокой скоростью. Вы тестируете очень конкретный номер счета в диапазоне 900 000 000 номеров счетов.

У вас не было бы метода под названием "IsAccountNumberVerified", который принимает номер счета в качестве значения. Номер счета будет поддерживаться и проверяться внутренне классом BackAccount, предоставляя номер счета только как свойство только для чтения.


Ron23111

Итак, есть ли другой способ сделать это, как я уже говорил, прежде чем я новичок в C# и тестировании. Я хочу, чтобы мой класс банковского счета генерировал случайный номер счета из 8 цифр, и каждый номер счета должен начинаться с 32, например 32091234, 32145498 и т. д...

Dave Kreskowiak

Это зависит от того, какой именно тест вы проводите. Если вы хотите узнать, соответствует ли номер счета определенному номеру, вы не можете сделать это с помощью чего-либо близкого к имеющемуся у вас коду. Вы должны использовать реализацию интерфейса в вашем классе BankAccount, которая принимает реализацию чего-то, что можно было бы назвать "IAccountNumberGenerator". Это понятие называется "инверсия контроля".

Ваш метод IsAccountNumberVerified был бы бесполезен в этом случае. Если единственное правило состоит в том, чтобы генерировать номера счетов, которые, скажем, имеют длину 10 цифр и начинаются с 32, вы можете легко написать код, который генерирует номера счетов в соответствии с этой спецификацией. Не было бы необходимости иметь метод для проверки этого в классе BankAccount. Вот для чего нужен ваш модульный тест.

Что касается интерфейса IAccountNumberGenerator, то ваш класс BankAccount может использовать его реализацию по умолчанию, если только вы не передадите другую реализацию, скажем, сделанную вашим модульным тестом.