Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mocking a global variable

I've been trying to implement some unit tests for a module. An example module named alphabet.py is as follows:

import database  def length_letters():     return len(letters)  def contains_letter(letter):     return True if letter in letters else False   letters = database.get('letters')   # returns a list of letters 

I'd like to mock the response from a database with some values of my choice, but the code below doesn't seem to work.

import unittests   import alphabet    from unittest.mock import patch      class TestAlphabet(unittest.TestCase):      @patch('alphabet.letters')     def setUp(self, mock_letters):         mock_letters.return_value = ['a', 'b', 'c']         def test_length_letters(self):         self.assertEqual(3, alphabet.length_letters())      def test_contains_letter(self):            self.assertTrue(alphabet.contains_letter('a')) 

I have seen many examples in which 'patch' is applied to methods and classes, but not to variables. I prefer not to patch the method database.get because I may use it again with different parameters later on, so I would need a different response.

What am I doing wrong here?

like image 469
Funkatic Avatar asked Jul 12 '16 18:07

Funkatic


People also ask

How do you mock global variables using jest?

If you need to mock a global variable for all of your tests, you can use the setupFiles in your Jest config and point it to a file that mocks the necessary variables. This way, you will have the global variable mocked globally for all test suites.

Can you mock a variable Python?

With a module variable you can can either set the value directly or use mock.


Video Answer


1 Answers

Variables can be patched as follows:

from mock import patch @patch('module.variable', new_value)     

For example:

import alphabet from mock import patch  @patch('alphabet.letters', ['a', 'b', 'c']) class TestAlphabet():      def test_length_letters(self):         assert 3 == alphabet.length_letters()      def test_contains_letter(self):         assert alphabet.contains_letter('a') 
like image 95
Valera Maniuk Avatar answered Sep 21 '22 20:09

Valera Maniuk