Получение другого результата для атрибута ячейки django в методе против unittest - PullRequest
1 голос
/ 28 марта 2019

Рабочий проект с использованием Django, в котором есть таблицы, строки, столбцы и ячейки.Столбец имеет метод reject (), который должен установить для атрибута is_rejected bool значение True для столбца, а затем все ячейки, связанные с этим столбцом.Строки отладки в методе reject () выглядят так, как будто он работает, но утверждения в юнит-тестах находят is_rejected равным False для связанных ячеек.

Я думал, что может быть условие гонки, когда утверждение произошло до процесса поискаи изменение ячеек завершено, поэтому я помещаю ожидание на пять секунд после column.reject (), но до подтверждения.Все еще не удалось.

Я подумал, что мог проверять неправильную ячейку в модульных тестах, поэтому я проверил значения ячеек по сравнению со значением ячейки, указанным в строках отладки, изменив значение несколько раз, чтобы увидеть, что они изменилисьв отладочном выводе, который они сделали.

Я много раз повторял имена переменных, чтобы убедиться, что я не совершил глупую ошибку, и если я сделал это, я все еще не вижу ее.

это отклонениеметод в столбце (включая строки отладки):

class Column(BaseModel):

    def reject(self):
        super().reject()

        #reject all cells associated with this Column
        for cell in self.cell_set.all():
            print("cell: ", cell)
            print("rejected: ", cell.is_rejected)
            cell.reject()
            print("rejected: ", cell.is_rejected)

Это соответствующий тест:

def test_reject_column_rejects_associated_cells(self):
        self.tb2 = Table.create(
            team_name='FooBarTeam',
            app_name='FooBarApp',
            config_name='FooBarConfig2',
            app_description='FooBarTeamDescription',
            created_by=self.user
        )

        self.co3 = Column.create(
            table_id=self.tb2.id,
            column_name="Bar",
            created_by=self.user,
            created_reason="Foo reason",
            column_default="abc",
            regex_ids=[],
            column_type="str"
        ) 

        self.rw4 = Row.create(
            created_by=self.user,
            table=self.tb2,
            columns=['Bar'],
            row_data=['123'],
            reason='FooReason'
        )

        self.cl3 = Cell.create(
           created_by = self.user,
            value = "Foo!",
            row = self.rw4,
            column = self.co3,
            reason = "FooReason"
        )

        self.assertEqual(
            self.cl3.is_rejected,
            False
        )

        self.assertEqual(
            self.co3.is_rejected,
            False
        )

        self.co3.reject()

        self.assertEqual(
            self.co3.is_rejected,
            True
        )

        #this is the only assertion that fails
        self.assertEqual(
            self.cl3.is_rejected,
            True
        )

Это вызов unittest только для запуска одного модульного теста, обратите внимание на строки отладкипоказать правильное поведение с атрибутом cell.is_rejected со значением True:

>python manage.py test tests/model_tests/test_config_models.py:ConfigReviewModelTest.test_reject_column_rejects_associated_cells

nosetests tests/model_tests/test_config_models.py:ConfigReviewModelTest.test_reject_column_rejects_associated_cells --with-coverage --cover-package=audit,config,config_importer,login,peer_review,tools,ui --exclude-dir=tests/functional_tests/test_ui --exclude-dir=tests/unit_tests --cover-html --cover-erase --cover-branches --verbosity=1

Creating test database for alias 'default'...

F

======================================================================

FAIL: test_reject_column_rejects_associated_cells (tests.model_tests.test_config_models.ConfigReviewModelTest)

----------------------------------------------------------------------

Traceback (most recent call last):

  File "c:\dev_env\config-manager-env\config-manager\tests\model_tests\test_config_models.py", line 1000, in test_reject_column_rejects_associated_cells

    True

AssertionError: False != True

-------------------- >> begin captured stdout << ---------------------
cell:  Foo! - Bar
cell column:  Bar
rejected:  False
rejected:  True

cell:  123 - Bar
cell column:  Bar
rejected:  False
rejected:  True
--------------------- >> end captured stdout << ----------------------

1 Ответ

1 голос
/ 28 марта 2019

Убедитесь, что метод reject действительно сохраняет изменения, внесенные в объект Python, в базу данных как для столбца, так и для связанных ячеек, т. Е. column.save() и cell.save().Затем, когда вы вызываете reject в столбце self.co3.reject(), вам нужно обновить объект Python ячейки, снова считав его из базы данных.

    self.cl3.refresh_from_db()
    self.assertEqual(
        self.cl3.is_rejected,
        True
    )

Ваши распечатанные тесты в функции отклонения работают, потому что вы вызываете reject для объектов, а затем печатаете поля из этих же объектов.

...