Let's say I have following classes:
check.py:
class Build:
def __init__(self, url):
self.url = url
self.parameters = {}
class Job:
def __init__(self, builds):
self.builds = []
for build in builds:
self.builds.append(build)
def builds_filter(self, builds_filter_func):
self.builds = [build for build in self.builds if builds_filter_func(build)]
def build_filter_according_to_name(job, name):
job.builds_filter((lambda build: build.parameters.get("NAME", "") == name))
if __name__ == '__main__':
job = Job([Build(url="url1"), Build(url="url3"), Build(url="url3")])
build_filter_according_to_name(job, "FOO")
I'd like to test in a unittest file the method build_filter_according_to_name
, with different sets of parameters in each build. How do I do it?
For example:
- A Job object with 5 builds, 1 of them has "NAME" == "foo".
- A Job object with 5 builds, 4 of them has "NAME" == "foo".
etc.
Do I have to loop over self.builds before each test, and assign the parameters for each build, like this?
test_check.py:
import unittest
from test.check import Job, Build, build_filter_according_to_name
NAME = "FOO"
class MyTestCase(unittest.TestCase):
def setUp(self):
self.job = Job([Build(url="url1"), Build(url="url3"), Build(url="url3")])
self.parameters = {
"NAME": "NAME",
"FOO": "BAR"
}
def init_params(self, number_of_foo_names=0):
for build in self.job.builds:
parameters = self.parameters.copy()
if number_of_foo_names > 0:
parameters["NAME"] = "FOO"
number_of_foo_names -= 1
build.parameters = parameters
def test_one_name_foo(self):
self.init_params(number_of_foo_names=1)
build_filter_according_to_name(self.job, name=NAME)
self.assertEqual(len(self.job.builds), 1)
def test_two_names_foo(self):
self.init_params(number_of_foo_names=2)
build_filter_according_to_name(self.job, name=NAME)
self.assertEqual(len(self.job.builds), 2)
if __name__ == '__main__':
unittest.main()
Or is there a better way to achieve it?