Py.test mixin类不能访问`self`

时间:2016-09-15 13:16:42

标签: python pytest

我正在尝试为一组共享的测试制作一个mixin。我希望每当我想要运行那些通用测试时,都能从mixin继承。

以下是我的一些混音:

class CommonRuleWhenTestsMixin(TestCase):

    def test_returns_false_if_rule_inactive(self):
        self.rule.active = False

        assert not self.rule.when(self.sim)

这是我使用mixin的时候:

class TestWhen(CommonRuleWhenTestsMixin):

        def setUp(self):
            self.customer = mommy.make(Customer)
            self.rule = mommy.make(
                UsageRule,
                customer=self.customer,
                max_recharges_per_month=2
            )
            self.sim = mommy.make(
                Sim,
                msisdn='0821234567',
                customer=self.customer
            )

            assert self.rule.when(self.sim)

        def test_returns_false_if_airtime_max_recharges_exceeded(self):
            self.rule.recharge_type = AIRTIME
            mommy.make(
                SimRechargeHistory,
                sim=self.sim,
                product_type=AIRTIME,
                _quantity=3
            )

            assert not self.rule.when(self.sim)

我一直收到这条消息:

_________ CommonRuleWhenTestsMixin.test_returns_false_if_rule_inactive _________                                                                                                                                  
simcontrol/rules/tests/test_models.py:14: in test_returns_false_if_rule_inactive                                                                                                                                  
    self.rule.active = False                                                                                                                                                                                      
E   AttributeError: 'CommonRuleWhenTestsMixin' object has no attribute 'rule'   

我的mixin如何访问子类的self上设置的变量?

1 个答案:

答案 0 :(得分:3)

你的混音来自this.defensesInRangeArcher = 0; for (var i = 0; i < buildArcherX.length; i++) { for (var i = 0; i < buildArcherY.length; i++) { if (Math.sqrt(Math.pow(buildArcherX[i] - this.x, 2) + Math.pow(buildArcherY[i] - this.y, 2)) <= arch.radius + 7) { this.defensesInRangeArcher += 1; if (!v.singleAimArcher && !this.dead) { this.attackByArcher = true; v.singleAimArcher = true; } } else { this.attackByArcher = false; v.singleAimArcher = false; } } } ,所以它的测试被pytest选中(也可能被unittest.TestCase拾取)。

相反,不要从任何内容(或来自Python上的unittest)继承你的mixin,并让你的object类继承TestWhen和{{1} }。