2016-04-20 3 views
-1

Я использую Visual Studio 2015, C# и тестирование модуля обучения. Мне нужно написать Unit Test для этого метода TransferFund, чтобы проверить, превышает ли сумма, чем баланс исходного счета. Тем не менее, я не могу правильно настроить Unit Test на нем, и я теряюсь относительно того, как.Единичный тест для перевода средств

Вот мой метод:

public void TransferFund(BankAccount source, BankAccount destination, double amount) 
{ 
    this.source = source.Balance; 
    this.destination = destination.Balance; 
    double Amount = amount; 

    if (this.source > Amount) 
    { 

     this.source -= Amount; 
     this.destination += Amount; 

    } 
    else 
    { 
     throw new ArgumentException("Insufficient funds for transfer."); 
    } 

} 

Unit Test:

[TestMethod] 
[TestCategory("TransferFunds")] 
public void TransferFunds__BalanceHigherThanAmount() 
{ 

} 

Поэтому мне нужно написать юнит-тестов, чтобы проверить баланс счета источника выше суммы.

Как я могу вызвать функцию в тесте ... если я попробую назвать класс, в котором он находится, он жалуется, что нет конструктора с 0 аргументами?

+0

Просто вызовите функцию 'TransferFund' здесь и проверьте возвращаемое значение. Функция 'Assert()' очень полезна для этой цели. Вы также можете использовать блок try-catch в методе тестирования, так как ваша оригинальная функция бросает. – dotNET

+0

Как я могу вызвать функцию в тесте ... если я попробую назвать класс его внутри, он жалуется, что нет конструктора с 0 аргументами? Я знаю, как выполнять функцию Assert, я больше ищу детали для нее. – Thisone

+0

См. Мой ответ ниже. – dotNET

ответ

-1

Просто позвоните в свою функцию TransferFund() и проверьте возвращаемое значение. Функция Assert() очень полезна для этой цели. Вы также можете использовать блок - catch в методе тестирования, так как ваша оригинальная функция бросает.

Что-то вроде этого:

[TestMethod] 
[TestCategory("TransferFunds")] 
public void TransferFunds__BalanceHigherThanAmount() 
{ 
    //You need to initialize your variables here. I don't know their 
    //definition, so I'm leaving that to you 
    BankAccount source; 
    BankAccount destination; 
    double amount = 1000; 

    TransferFund(source, destination, amount); 
} 

Теперь вы можете запустить этот метод тестирования и проверки теста окно результатов, которые будут визуально указать, передается ли ваш тест или неудачу.

+0

@stuartd: Ты прав. Обновлен мой ответ. – dotNET

+0

Я пробовал это раньше, и я понимаю, что TransferFund не существует в текущем контексте. TransferFund находится в классе Person. – Thisone

+0

Вы не показали класс 'Person' в своем посте. Если ваш метод находится в другом классе, вам просто нужно создать объект класса, а затем вызвать метод через этот объект.Все это довольно простые вещи. – dotNET

0

Метод не делает ничего, что можно проверить снаружи. Все, что вы можете сказать, заключается в том, что код работал без повышения исключения. Если вы хотите проверить, за исключением, попробуйте следующее:

public void TransferFunds__BalanceLessThanAmount() 
{ 
    // Arrange 
    Exception expectedException = null; 
    string expectedMessage = "Insufficient funds for transfer."; 
    double testSourceBalance = 1000; 
    double testDestinationBalance = 3000; 
    double testTransferAmount = 1200; 
    BankAccount testSource = new BankAccount {Balance = testSourceBalance}; 
    BankAccount testDestination = new BankAccount {Balance = testDestinationBalance}; 

    // Act 
    try 
    { 
     TransferFund(testSource, testDestination, testTransferAmount); 
    } 
    catch (Exception ex) 
    { 
     expectedException = ex; 
    } 

    // Assert 
    Assert.IsNotNull(expectedException); 
    Assert.IsInstanceOfType(expectedException, typeof (ArgumentException)); 
    Assert.AreEqual(expectedMessage, expectedException.Message); 
} 
0

Итак, если у вас есть проблемы с созданием экземпляра класса вашей функции, вы можете подделать его с Typemock Isolator, к примеру, так что вы не нужно создавать для него интерфейс. Посмотрите:

[TestMethod] 
[TestCategory("TransferFunds")] 
public void TransferFunds__BalanceHigherThanAmount() 
{ 
    UnderTest target = Isolate.Fake.Instance<UnderTest>(Members.CallOriginal); 

    try 
    { 
     target.TransferFund(new BankAccount { Balance = 100 }, new BankAccount { Balance = 100 }, 50); 
    } 
    catch (Exception ex) 
    { 
     Assert.Fail("Expected no exception, but got: " + ex.Message); 
    } 
} 

По Isolate.Fake.Instance<UnderTest>(Members.CallOriginal); вы получаете экземпляр вашего класса со всеми без подделать членов. Затем, чтобы утверждать, что баланс исходной учетной записи выше суммы, вы проверяете, что исключение не было выбрано.

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

Смежные вопросы