引发异常的单元测试方法

时间:2019-04-26 12:41:32

标签: python unit-testing

如果我们通过错误的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 个答案:

答案 0 :(得分:5)

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)