首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django单元测试-自属性的更改将从测试持续到测试。

Django单元测试-自属性的更改将从测试持续到测试。
EN

Stack Overflow用户
提问于 2022-08-23 12:15:17
回答 1查看 62关注 0票数 2

我有一个测试类,它有这样的设置。我们从具有一些默认数据的test_helpers文件中导入一个字典。数据从一开始就被设置为FORM_DATA['value_A'] = 0FORM_DATA['value_B'] = 1000000

无论是将FORM_DATA设置为self.form_data值,还是将其赋值给每个测试中的变量,都无关紧要。第二次测试似乎坚持了字典从第一次测试到第一次测试的变化,这对测试来说并不理想。

我添加了一组打印调试语句来显示正在发生的事情。即使在第二个测试的setUp()中,它也显示了以前测试中的值!这里发生了什么事?为什么每次我有新测试时字典self.form_data就不能成为默认导入的数据呢?

代码语言:javascript
复制
from test_helpers import FORM_DATA

class TestBaselineScenarios(TestCase):
    @classmethod
    def setUpClass(cls):
        super(TestBaselineScenarios, cls).setUpClass()
        long_running_data_setup()

    def setUp(self):
        self.form_data = FORM_DATA
        print("setUp", self.form_data['value_A'], self.form_data['value_B'])

    def test_one(self):
        print("1")
        print(self.form_data['value_A'], self.form_data['value_B'])
        self.form_data['value_A'] = 25000
        self.form_data['value_B'] = 700000
        print("2")
        print(self.form_data['value_A'], self.form_data['value_B'])
        simulation = test_helpers.create_simulation(form_data=self.form_data)
        simulation.run()
        self.assertEqual(0.8416667, round(simulation.success_rate(), 7))

    def test_two(self):
        print("3")
        print(self.form_data['value_A'], self.form_data['value_B'])
        self.form_data['value_A'] = 10000
        print("4")
        print(self.form_data['value_A'], self.form_data['value_B'])
        simulation = test_helpers.create_simulation(form_data=self.form_data)
        simulation.run()
        self.assertEqual(0.9916667, round(simulation.success_rate(), 7))
代码语言:javascript
复制
setUp 0 1000000
1
0 1000000
2
25000 700000


setUp 25000 700000
3
25000 700000
4
10000 700000
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-23 12:19:08

运行此代码时:

代码语言:javascript
复制
self.form_data = FORM_DATA

实际上,您不是在复制FORM_DATA的内容,而是存储对它的引用。因此,当您运行self.form_data['value_A'] = 25000时,您也在更改FORM_DATA

下次运行setUp时,只需将修改后的FORM_DATA的相同引用重新分配到self.form_data中。

试着做一个FORM_DATA的副本。

Python有两种方法来创建事物的副本。假设FORM_DATA是一个垃圾,最简单的方法就是调用dict.copy。如果比较复杂,还可以使用built-in copy library创建一个浅拷贝。

将setUp函数更改为:

代码语言:javascript
复制
    def setUp(self):
        self.form_data = FORM_DATA.copy()
        print("setUp", self.form_data['value_A'], self.form_data['value_B'])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73458568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档