2016-02-24 2 views
0

Мне 3 недели в программировании для самостоятельного изучения онлайн курса python. Цель состоит в том, чтобы расширить базовый класс BankAccount, в котором вы можете вывести столько, сколько хотите, подкласса MinimumBalanceAccount, где избыточные отбраки отклоняются. Вот то, что я до сих пор:Код передает ручные тесты, но сбой при модульном тестировании, возможно?

class BankAccount: 
    def __init__(self, balance): 
     self.balance = balance 

    def deposit(self, amount): 
     self.balance += amount 
     return self.balance 

    def withdraw(self, amount): 
     if(amount > self.balance): 
      print "invalid transaction." 
     else: 
      self.balance -= amount 
      return self.balance 

class MinimumBalanceAccount(BankAccount): 
    def __init__(self, minimum_balance): 
     BankAccount.__init__(self, self.balance) 
     self.minimum_balance = minimum_balance 

    def withdraw(self, amount): 
     if(self.balance - amount < self.minimum_balance): 
      print "Minimum balance exceeded." 
     else: 
      self.balance -= amount 
      return self.balance 

Поскольку онлайновый курс имеет онлайн особенности модульного тестирования, я написал следующее UnitTest из определения упражнения:

import unittest 

class AccountBalanceTestCases(unittest.TestCase): 
    def setUp(self): 
     self.my_account = BankAccount(90) 
    # omitting tests that pass ok... 
    def test_invalid_operation(self): 
     self.assertEqual(self.my_account.withdraw(1000), "invalid transaction", msg='Invalid transaction') 

unittest.main(verbosity=2) 

Испытания, как ожидается, пройдет, но :

$ python bank2.py 
test_invalid_operation (__main__.AccountBalanceTestCases) ... invalid transaction. 
FAIL 

====================================================================== 
FAIL: test_invalid_operation (__main__.AccountBalanceTestCases) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "bank2.py", line 36, in test_invalid_operation 
    self.assertEqual(self.my_account.withdraw(1000), "invalid transaction", msg='Invalid transaction') 
AssertionError: Invalid transaction 

---------------------------------------------------------------------- 
Ran 1 test in 0.001s 

FAILED (failures=1) 
$ 

Что я делаю неправильно?

+3

Что точно не проходит? –

+0

Обратите внимание, что одна очевидная ошибка заключается в том, что ваш метод вывода не возвращает недопустимое сообщение транзакции, как как инструкции, так и ваше тестовое состояние, вместо этого оно печатает. –

+0

Это говорит мне, что ошибка в вашем коде. – user7479

ответ

4

В UnitTest возвращается:

..invalid transaction. 
F.. 
====================================================================== 
FAIL: test_invalid_operation (__main__.AccountBalanceTestCases) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "bank.py", line 48, in test_invalid_operation 
    self.assertEqual(self.my_account.withdraw(1000), "invalid transaction", msg='Invalid transaction') 
AssertionError: Invalid transaction 

---------------------------------------------------------------------- 
Ran 5 tests in 0.001s 

FAILED (failures=1) 
$ 

Первое замечание большое объятие для вдаваясь в модульное тестирование сразу. Однако unittest.Testcase не должен print ничего, потому что это будет толкать мусор в выходе unittest.

В этом случае мы читаем из исключения, что self.my_account.withdraw(1000) не возвращает "invalid transaction". И в самом деле:

def withdraw(self, amount): 
    if(self.balance - amount < self.minimum_balance): 
     print "Minimum balance exceeded." 
    else: 
     self.balance -= amount 
     return self.balance 

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

Для прохождения теста метод withdraw должен был бы вернуть строку "invalid transaction". Здесь нет ничего плохого в наследовании, но когда вы перезаписываете метод, вы не наследуете реализацию суперкласса этого метода (если вы не назовете его объяснительным).

def withdraw(self, amount): 
    if(self.balance - amount < self.minimum_balance): 
     print "Minimum balance exceeded." 
     return "invalid transaction" 
    else: 
     self.balance -= amount 
     return self.balance 

Общее замечание задавать вопросы: Было бы большим подспорьем, когда код правильно отступом, а также, когда у нас есть исключение под рукой сразу же;)

Update нырять немного больше в вопросе наследования: Когда вы хотите MinimumBalanceAccount быть истинным BankAccount, вы должны заботиться не только для minimum_balance, но и для открытия balance, потому что это часть нуждается в суперкласс:

class MinimumBalanceAccount(BankAccount): 
    def __init__(self, balance, minimum_balance): 
     BankAccount.__init__(self, balance) 
     self.minimum_balance = minimum_balance 
    def withdraw(self, amount): 
     ... 

Я сделал это испытание приводимого, конечно:

class MBATest(unittest.TestCase): 
    def setUp(self): 
    self.my_mba = MinimumBalanceAccount(90, 10) 
    def test_mba_withdraw(self): 
    # put in one test to be sure about the oder of execution ;) 
    self.assertEqual(self.my_mba.withdraw(10), 80) 
    self.assertEqual(self.my_mba.withdraw(100), "invalid transaction") 

и этот один будет проходить. Потому что я люблю многословие, я использую unittest.main(verbosity=2) и в конечном итоге с:

$ python bank.py 
test_balance (__main__.AccountBalanceTestCases) ... ok 
test_deposit (__main__.AccountBalanceTestCases) ... ok 
test_invalid_operation (__main__.AccountBalanceTestCases) ... ok 
test_sub_class (__main__.AccountBalanceTestCases) ... ok 
test_withdraw (__main__.AccountBalanceTestCases) ... ok 
test_mba_withdraw (__main__.MBATest) ... ok 
---------------------------------------------------------------------- 
Ran 6 tests in 0.000s 
OK 
$ 

Может быть, вы должны работать через this question и, если вам нравится это трудный путь, также this one ...

+0

Благодарим вас за отзыв и прощайте за мои глупые ошибки, не отступая. Еще не прочитал об исключении. Нужен ли мне вопрос для реализации подкласса, или я могу просто использовать проход? Любые подсказки по исправлению моего кода, чтобы отразить то, что задано. – user7479

+0

Ничего. Мы все ученики практически во всем;) Обновленный ответ для решения вопроса о наследовании. – flaschbier

+0

Благодарим вас, изменили код, удалив метод вывода в классе суперкласса и добавив третий вариант: if (amount> self.balance): напечатайте «недействительные транзакции». в методе снятия подкласса. Все ручные тесты проходят, но не текст блока: – user7479

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