Mock global function call while importing

2024/10/6 10:26:01

Suppose I have a file called a.py with code like

import mod1
mod1.a()def b():print("hi")

Now if I want to mock fun b() then unittest.py while have import statement at top like

from a import b

at time of import mod1.a() will be called. How can I mock that call which is happening at the time of import.

Answer

Consider removing code from module top-level, by moving it to a block protected by

if __name__ == '__main__':mod1.a()... # the rest of your top level code

This way the protected code does not get executed on imports, only when run directly.

If you still need the call there and want to mock it, it is very simple. With files like this,

# mod.pyimport mod1
mod1.a()def b():print("hi")# mod1.pydef a():print('Running a!')# test_1.py
# Note: do not call unittest.py to a file.
# That is the name of a module from the Python stdlib,
# you actually need to use it and things will not work,
# because Python tries to load your file not the library you need.from unittest.mock import patchwith patch('mod1.a') as mock_a:... # configure mock_a here if there is a need, for example# to set a fake a call resultimport mod... # the rest of your testing code. Use `mock_a` if you want to# inspect `a` calls.

Outside the with mod1.a is no longer mocked. There are other ways to start and stop mocking, you should look into the documentation. Before studying mock make sure you understand well how unittests work and how you can organize your tests.

https://en.xdnf.cn/q/118960.html

Related Q&A

can the order of code make this program faster?

Hi this is my first post, I am learning how to write code so technically I am a newbie.I am learning python I am still at the very basics, I was getting to Know the if statement and I tried to mix it …

How can I label a node that is the initial vertex in a cycle from graph data

I need to implement an algorithm such that in a collection of unique and ordered graph edges, I can find a cyclic node. E.g. for a ->b, b->c, c->a, then a is a cyclic node and thus I want to a…

Pandas : How to drop #DIV/0! and NA values in new column in pandas dataframe?

I did some calculation and have #DIV/0! in my dataframe. How to drop these values and count further ? I followed df.dropna but dataframe still counting #DIV/0!. Please suggest.df.insert(loc=df.column…

unsupported operand for 3 instances of two classes and one method?

Im trying to get the program to take the hp stat from enemyUnit, the attack stat from unit, and the damage stat from tackle and put them into one math problem in the method getHit(). this is the code:…

Telling the script to wait until button is clickable? [duplicate]

This question already has answers here:Check whether element is clickable in selenium(3 answers)Closed 4 years ago.Im writing a script in Selenium (Python) and I am having an issue with a disabled clic…

Python: UnicodeDecodeError: utf8

Im having problem to save accented letters. Im using POSTGRESQL and Python 2.7POSTGRESQL - ENCODING = LATIN1I already added this line but does not worked! #!/usr/bin/python # -*- coding: UTF-8 -*-More…

Get continuous response of POST request in python

Im writing a script which does a POST request to a server and gets blocked the server keeps sending the response whenever a specific event is triggered. I have to take a cookie for post request with ea…

DataType of Pandas Multiindex [duplicate]

This question already has answers here:get the dtype of a pandas multiindex(3 answers)Closed 6 years ago.import pandas as pd index = pd.MultiIndex.from_tuples([(1,2, None), (1,2,3)]) print(index.get_le…

Is there a way to see the internal representation of float?

In python tutorial for floating point, In base 2, 1/10 is the infinitely repeating fraction0.0001100110011001100110011001100110011001100110011...How do I get python interpreter to print this intenal re…

Create function from try-except

Based on the example provided in this answer, how can I create a function from:from collections import Counter s = [0, 0, 2, 1, 1, 0, 0, 0] try:print(next(t[0] for t in Counter(s).most_common(2) if t[…