FactoryBoy / factory_boy

A test fixtures replacement for Python

Home Page:https://factoryboy.readthedocs.io/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Type error

Shodiev-Shokhrukh opened this issue · comments

Screenshot from 2024-05-04 15-08-34

Description

Type error happened when i use my factories in my tests

To Reproduce

Type error happened when i use my factories in my tests

Model / Factory code
    """
    agro.apps.financing.models.FinancingPlacement
    """

    class Meta:
        model = FinancingPlacement

    cotton_petition = SubFactory('agro.apps.financing.factories.PetitionPreferentialCreditFactory')
    placement = SubFactory('agro.apps.placement.factories.PlacementFactory')
    gross_product = Faker('pydecimal', left_digits=16, right_digits=3, positive=True)
    price = Faker('pydecimal', left_digits=16, right_digits=3, positive=True)
    summa_credit = Faker('pydecimal', left_digits=16, right_digits=3, positive=True)

   class FinancingPlacement(FakeRemoveModel):
    cotton_petition = models.ForeignKey(
        PetitionPreferentialCredit,
        related_name="finance_references",
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        verbose_name=_("Paxta imtiyozli kredit arizasi"),
    )
    placement = models.ForeignKey(
        "placement.Placement", on_delete=models.CASCADE, null=True, blank=True, verbose_name=_("Ekin joylashuvi")
    )
    gross_product = models.DecimalField(
        _("Yalpi hosil, tn"), decimal_places=3, max_digits=19, null=True, blank=True
    )
    price = models.DecimalField(
        _("Qiymati, ming so'm"), decimal_places=2, max_digits=18, null=True, blank=True
    )
    summa_credit = models.DecimalField(
        _("Talab etiladigan kredit, ming so'm"),
        decimal_places=2,
        max_digits=15,
        null=True,
        blank=True,
    )

    class Meta:
        verbose_name = _("Paxta imtiyozli kredit ekin")
        verbose_name_plural = _("Paxta imtiyozli kredit ekinlar")

The issue

i dont know why this issue happened before i used factories it didnt happen

    def test_full_clean_gross_product_greater_than_placement_normative(self):
>       placement = self.factory()

agro/apps/financing/tests/test_models/test_financing_placement.py:24: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/local/lib/python3.9/site-packages/factory/base.py:40: in __call__
    return cls.create(**kwargs)
/usr/local/lib/python3.9/site-packages/factory/base.py:528: in create
    return cls._generate(enums.CREATE_STRATEGY, kwargs)
/usr/local/lib/python3.9/site-packages/factory/django.py:117: in _generate
    return super()._generate(strategy, params)
/usr/local/lib/python3.9/site-packages/factory/base.py:465: in _generate
    return step.build()
/usr/local/lib/python3.9/site-packages/factory/builder.py:258: in build
    step.resolve(pre)
/usr/local/lib/python3.9/site-packages/factory/builder.py:199: in resolve
    self.attributes[field_name] = getattr(self.stub, field_name)
/usr/local/lib/python3.9/site-packages/factory/builder.py:344: in __getattr__
    value = value.evaluate_pre(
/usr/local/lib/python3.9/site-packages/factory/declarations.py:48: in evaluate_pre
    return self.evaluate(instance, step, context)
/usr/local/lib/python3.9/site-packages/factory/declarations.py:395: in evaluate
    return step.recurse(subfactory, extra, force_sequence=force_sequence)
/usr/local/lib/python3.9/site-packages/factory/builder.py:216: in recurse
    return builder.build(parent_step=self, force_sequence=force_sequence)
/usr/local/lib/python3.9/site-packages/factory/builder.py:258: in build
    step.resolve(pre)
/usr/local/lib/python3.9/site-packages/factory/builder.py:199: in resolve
    self.attributes[field_name] = getattr(self.stub, field_name)
/usr/local/lib/python3.9/site-packages/factory/builder.py:344: in __getattr__
    value = value.evaluate_pre(
/usr/local/lib/python3.9/site-packages/factory/declarations.py:48: in evaluate_pre
    return self.evaluate(instance, step, context)
/usr/local/lib/python3.9/site-packages/factory/declarations.py:395: in evaluate
    return step.recurse(subfactory, extra, force_sequence=force_sequence)
/usr/local/lib/python3.9/site-packages/factory/builder.py:216: in recurse
    return builder.build(parent_step=self, force_sequence=force_sequence)
/usr/local/lib/python3.9/site-packages/factory/builder.py:258: in build
    step.resolve(pre)
/usr/local/lib/python3.9/site-packages/factory/builder.py:199: in resolve
    self.attributes[field_name] = getattr(self.stub, field_name)
/usr/local/lib/python3.9/site-packages/factory/builder.py:344: in __getattr__
    value = value.evaluate_pre(
/usr/local/lib/python3.9/site-packages/factory/declarations.py:48: in evaluate_pre
    return self.evaluate(instance, step, context)
/usr/local/lib/python3.9/site-packages/factory/faker.py:48: in evaluate
    return subfaker.format(self.provider, **extra)
/usr/local/lib/python3.9/site-packages/faker/generator.py:88: in format
    return self.get_formatter(formatter)(*args, **kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <faker.generator.Generator object at 0x79af5303dee0>
formatter = <built-in method date of datetime.datetime object at 0x79af5192cc90>

    def get_formatter(self, formatter: str) -> Callable:
        try:
>           return getattr(self, formatter)
E           TypeError: getattr(): attribute name must be string

/usr/local/lib/python3.9/site-packages/faker/generator.py:92: TypeError

 agro/apps/financing/tests/test_models/test_financing_placement.py::TestFinancingPlacement.test_full_clean_gross_product_greater_than_placement_normative50% █████     

――――――――――――――――――――――――――――――― TestFinancingPlacement.test_save_price_calculation ――――――――――――――――――――――――――――――――

self = <agro.apps.financing.tests.test_models.test_financing_placement.TestFinancingPlacement object at 0x79af53394040>

    def test_save_price_calculation(self):
>       placement = self.factory()

agro/apps/financing/tests/test_models/test_financing_placement.py:31: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/local/lib/python3.9/site-packages/factory/base.py:40: in __call__
    return cls.create(**kwargs)
/usr/local/lib/python3.9/site-packages/factory/base.py:528: in create
    return cls._generate(enums.CREATE_STRATEGY, kwargs)
/usr/local/lib/python3.9/site-packages/factory/django.py:117: in _generate
    return super()._generate(strategy, params)
/usr/local/lib/python3.9/site-packages/factory/base.py:465: in _generate
    return step.build()
/usr/local/lib/python3.9/site-packages/factory/builder.py:258: in build
    step.resolve(pre)
/usr/local/lib/python3.9/site-packages/factory/builder.py:199: in resolve
    self.attributes[field_name] = getattr(self.stub, field_name)
/usr/local/lib/python3.9/site-packages/factory/builder.py:344: in __getattr__
    value = value.evaluate_pre(
/usr/local/lib/python3.9/site-packages/factory/declarations.py:48: in evaluate_pre
    return self.evaluate(instance, step, context)
/usr/local/lib/python3.9/site-packages/factory/declarations.py:395: in evaluate
    return step.recurse(subfactory, extra, force_sequence=force_sequence)
/usr/local/lib/python3.9/site-packages/factory/builder.py:216: in recurse
    return builder.build(parent_step=self, force_sequence=force_sequence)
/usr/local/lib/python3.9/site-packages/factory/builder.py:258: in build
    step.resolve(pre)
/usr/local/lib/python3.9/site-packages/factory/builder.py:199: in resolve
    self.attributes[field_name] = getattr(self.stub, field_name)
/usr/local/lib/python3.9/site-packages/factory/builder.py:344: in __getattr__
    value = value.evaluate_pre(
/usr/local/lib/python3.9/site-packages/factory/declarations.py:48: in evaluate_pre
    return self.evaluate(instance, step, context)
/usr/local/lib/python3.9/site-packages/factory/declarations.py:395: in evaluate
    return step.recurse(subfactory, extra, force_sequence=force_sequence)
/usr/local/lib/python3.9/site-packages/factory/builder.py:216: in recurse
    return builder.build(parent_step=self, force_sequence=force_sequence)
/usr/local/lib/python3.9/site-packages/factory/builder.py:258: in build
    step.resolve(pre)
/usr/local/lib/python3.9/site-packages/factory/builder.py:199: in resolve
    self.attributes[field_name] = getattr(self.stub, field_name)
/usr/local/lib/python3.9/site-packages/factory/builder.py:344: in __getattr__
    value = value.evaluate_pre(
/usr/local/lib/python3.9/site-packages/factory/declarations.py:48: in evaluate_pre
    return self.evaluate(instance, step, context)
/usr/local/lib/python3.9/site-packages/factory/faker.py:48: in evaluate
    return subfaker.format(self.provider, **extra)
/usr/local/lib/python3.9/site-packages/faker/generator.py:88: in format
    return self.get_formatter(formatter)(*args, **kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <faker.generator.Generator object at 0x79af5303dee0>
formatter = <built-in method date of datetime.datetime object at 0x79af5192cc90>

    def get_formatter(self, formatter: str) -> Callable:
        try:
>           return getattr(self, formatter)
E           TypeError: getattr(): attribute name must be string

/usr/local/lib/python3.9/site-packages/faker/generator.py:92: TypeError

 agro/apps/financing/tests/test_models/test_financing_placement.py::TestFinancingPlacement.test_save_price_calculation75% ███████▌  

―――――――――――――――――――――――――――― TestFinancingPlacement.test_save_summa_credit_calculation ――――――――――――――――――――――――――――

self = <agro.apps.financing.tests.test_models.test_financing_placement.TestFinancingPlacement object at 0x79af53394430>

    def test_save_summa_credit_calculation(self):
>       placement = self.factory()

agro/apps/financing/tests/test_models/test_financing_placement.py:37: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/local/lib/python3.9/site-packages/factory/base.py:40: in __call__
    return cls.create(**kwargs)
/usr/local/lib/python3.9/site-packages/factory/base.py:528: in create
    return cls._generate(enums.CREATE_STRATEGY, kwargs)
/usr/local/lib/python3.9/site-packages/factory/django.py:117: in _generate
    return super()._generate(strategy, params)
/usr/local/lib/python3.9/site-packages/factory/base.py:465: in _generate
    return step.build()
/usr/local/lib/python3.9/site-packages/factory/builder.py:258: in build
    step.resolve(pre)
/usr/local/lib/python3.9/site-packages/factory/builder.py:199: in resolve
    self.attributes[field_name] = getattr(self.stub, field_name)
/usr/local/lib/python3.9/site-packages/factory/builder.py:344: in __getattr__
    value = value.evaluate_pre(
/usr/local/lib/python3.9/site-packages/factory/declarations.py:48: in evaluate_pre
    return self.evaluate(instance, step, context)
/usr/local/lib/python3.9/site-packages/factory/declarations.py:395: in evaluate
    return step.recurse(subfactory, extra, force_sequence=force_sequence)
/usr/local/lib/python3.9/site-packages/factory/builder.py:216: in recurse
    return builder.build(parent_step=self, force_sequence=force_sequence)
/usr/local/lib/python3.9/site-packages/factory/builder.py:258: in build
    step.resolve(pre)
/usr/local/lib/python3.9/site-packages/factory/builder.py:199: in resolve
    self.attributes[field_name] = getattr(self.stub, field_name)
/usr/local/lib/python3.9/site-packages/factory/builder.py:344: in __getattr__
    value = value.evaluate_pre(
/usr/local/lib/python3.9/site-packages/factory/declarations.py:48: in evaluate_pre
    return self.evaluate(instance, step, context)
/usr/local/lib/python3.9/site-packages/factory/declarations.py:395: in evaluate
    return step.recurse(subfactory, extra, force_sequence=force_sequence)
/usr/local/lib/python3.9/site-packages/factory/builder.py:216: in recurse
    return builder.build(parent_step=self, force_sequence=force_sequence)
/usr/local/lib/python3.9/site-packages/factory/builder.py:258: in build
    step.resolve(pre)
/usr/local/lib/python3.9/site-packages/factory/builder.py:199: in resolve
    self.attributes[field_name] = getattr(self.stub, field_name)
/usr/local/lib/python3.9/site-packages/factory/builder.py:344: in __getattr__
    value = value.evaluate_pre(
/usr/local/lib/python3.9/site-packages/factory/declarations.py:48: in evaluate_pre
    return self.evaluate(instance, step, context)
/usr/local/lib/python3.9/site-packages/factory/faker.py:48: in evaluate
    return subfaker.format(self.provider, **extra)
/usr/local/lib/python3.9/site-packages/faker/generator.py:88: in format
    return self.get_formatter(formatter)(*args, **kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <faker.generator.Generator object at 0x79af5303dee0>
formatter = <built-in method date of datetime.datetime object at 0x79af5192cc90>

    def get_formatter(self, formatter: str) -> Callable:
        try:
>           return getattr(self, formatter)
E           TypeError: getattr(): attribute name must be string

/usr/local/lib/python3.9/site-packages/faker/generator.py:92: TypeError

Notes

Add any notes you feel relevant here :)

Can you provide us with the definition of your factory?

It looks like you're passing a non-string value to some factory.Faker(...) call; those expect the name of one of Faker's providers.

I'm going to close this, as we don't have enough details to move forward.

Feel free to reopen the issue if you are able to provide those!