Se moquant d'une variable globale

J'ai essayé de mettre en œuvre de tests unitaires pour un module. Un exemple de module nommé alphabet.py est comme suit:

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

J'aimerais simuler la réponse à partir d'une base de données avec des valeurs de mon choix, mais le code ci-dessous ne semble pas fonctionner.

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'))

J'ai vu de nombreux exemples où des "patch" est appliqué à des méthodes et des classes, mais pas à des variables. Je préfère ne pas le patch de la méthode base de données.obtenir parce que je peut l'utiliser à nouveau avec des paramètres différents, plus tard, j'aurais besoin d'une réponse différente.

Ce que je fais mal?

OriginalL'auteur Funkatic | 2016-07-12