Метод модульного тестирования, который вызывает и исключение - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь провести юнит-тестирование, если метод, отвечающий за возврат цены данного товара, вызывает исключение, если мы сдали плохой тест item_id - find_price_of_given_id.

:

import unittest
from Automat import Automat
from Bank import Bank
from Item import Item
from exceptions.NoItemException import NoItemException


class AutomatTest(unittest.TestCase):

    def test_checkPriceOfGivenID(self):
        bank = Bank()
        automat = Automat(bank)
        Cola = Item(2)
        automat.add_object(Cola)
        self.assertEqual(automat.find_price_of_given_id(30), 2)

    def test_checkPriceOfGivenIDWithInvalidID(self):
        bank = Bank()
        automat = Automat(bank)
        Cola = Item(2)
        automat.add_object(Cola)
        self.assertRaises(NoItemException, automat.find_price_of_given_id(31))

Класс автомата:

if __name__ == '__main__':
    unittest.main()


from Item import Item
from exceptions.NoItemException import NoItemException
from exceptions.NoProperAmountException import NoProperAmountException
from Coin import Coin
from decimal import *
class Automat:

    def __init__(self, _bank, objects=None):
        self.item_id = 30
        self.bank = _bank
        if objects is None:
            objects = {}


        self.objects = objects
        self.purchaseItemBank = []

    def add_object(self, obj: Item):
        id_to_assign = self.item_id
        self.objects.update({id_to_assign: obj})
        self.item_id += 1
        return id_to_assign

    def find_price_of_given_id(self, item_id):
        if self.objects.get(item_id) is not None:
            return self.objects.get(item_id).get_price()
        else:
            raise NoItemException

    def find_amount_of_given_id(self, item_id):
        if self.objects.get(item_id) is not None:
            return self.objects.get(item_id).get_amount()
        else:
            raise NoItemException

    def checkIfAmountIsPositive(self, item_id):
        if self.objects.get(item_id) is not None:
            var = True if self.objects.get(item_id).get_amount() > 0 else False
            return var
        else:
            raise NoItemException

    def withdrawItem(self, item_id):
        self.objects.get(item_id).decrease()

    def getAmountOfGivenNominal(self, coinValue):
        counter = 0
        for iterator in self.bank.bank:
            if iterator.getCoinValue() == coinValue:
                counter += 1
        return counter

К сожалению, я получил

Error
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\unittest\case.py", line 59, in testPartExecutor
    yield
  File "C:\ProgramData\Anaconda3\lib\unittest\case.py", line 615, in run
    testMethod()
  File "C:\Users\Admin\PycharmProjects\vending-machine\AutomatTest.py", line 22, in test_checkPriceOfGivenIDWithInvalidID
    self.assertRaises(NoItemException, automat.find_price_of_given_id(31))
  File "C:\Users\Admin\PycharmProjects\vending-machine\Automat.py", line 28, in find_price_of_given_id
    raise NoItemException
exceptions.NoItemException.NoItemException



Ran 1 test in 0.003s

FAILED (errors=1)

Process finished with exit code 1

Класс предмета:

class Item:
    def __init__(self, price, amount=5):
        self.amount = amount
        self.price = price

    def get_price(self):
        return self.price

    def get_amount(self):
        return self.amount

    def decrease(self):
        self.amount -= 1

    def __str__(self):
        return f"{self.amount} @ {self.price}"

1 Ответ

5 голосов
/ 26 апреля 2019
self.assertRaises(NoItemException, automat.find_price_of_given_id(31))

Вы вызываете метод, а затем передаете его возвращаемое значение в assertRaises; но прежде чем это может произойти, исключение уже выдвинуто. Это не то, как вы используете assertRaises. Вы можете использовать его двумя способами:

  1. Передайте метод, который вы хотите вызвать, и его аргументы в assertRaises:

    self.assertRaises(NoItemException, automat.find_price_of_given_id, 31)
    

    Примечание: нет (), вы не называете это сами!

  2. Используйте его как менеджер контекста:

    with self.assertRaises(NoItemException):
        automat.find_price_of_given_id(31)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...