Почему поле объекта в модульном тесте не изменяется в Django
Я не понимаю, почему мой тест не работает. У меня есть страница с товаром. Есть форма с кнопкой 'Купить товар'. После нажатия этой кнопки, если у клиента достаточно денег, товар будет куплен и количество денег на счету изменится. Но в моем тесте количество денег после покупки товара остается прежним, хотя объект (купленный товар) будет создан.
Модель приобретенного товара:
class BoughtItem(models.Model):
name = models.CharField(max_length=100, verbose_name='Название товара или акции', blank=True)
price = models.IntegerField(verbose_name='Цена', blank=True)
created_at = models.DateTimeField(auto_now_add=True)
Модель профиля:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
money = models.IntegerField(default=0)
Форма:
class BuyForm(forms.ModelForm):
class Meta:
model = BoughtItem
fields = ('name',)
widgets = {'name': forms.HiddenInput()}
view:
class ItemDetailView(generic.DetailView):
model = Item
template_name = 'item_detail.html'
context_object_name = 'item'
def get_object(self, queryset=None):
return get_object_or_404(Item, pk=self.kwargs.get('pk'))
def post(self, request, *args, **kwargs):
buy_form = BuyForm(request.POST)
if buy_form.is_valid():
purchase = buy_form.save(commit=False)
item = self.get_object()
user = Profile.objects.get(user__username=request.user.username)
if user.money >= item.price:
sum_difference = user.money - item.price
user.money = sum_difference
user.save()
purchase.name = item.name
purchase.price = item.price
purchase.save()
return HttpResponseRedirect(reverse('account', kwargs={'username': request.user.username}))
else:
return HttpResponseRedirect(reverse('purchase_error'))
else:
return render(request, 'item_detail.html',
context={'buy_form': buy_form, 'object': self.get_object()})
Урлы:
urlpatterns = [
path('shop_list/', ShopListView.as_view(), name='shop_list'),
path('<str:name>', ItemListView.as_view(), name='shop_detail'),
path('item/<int:pk>', ItemDetailView.as_view(), name='item_detail'),
path('purchase_error/', purchase_error, name='purchase_error'),
]
тест:
class ShopTest(TestCase):
@classmethod
def setUpTestData(cls):
Shop.objects.create(
name='Samsung',
description='Магазин электроники',
)
Item.objects.create(
name='Телефон Samsung A50',
description='Описание телефона',
price=20000,
shop_id=Shop.objects.get(name='Samsung').pk
)
user = User.objects.create(username='testuser')
user.set_password('12345')
user.save()
Profile.objects.create(
user=user,
money=100000
)
def test_if_change_field_money_after_purchase(self):
self.client.login(username='testuser', password='12345')
user = Profile.objects.get(user__username='testuser')
item = Item.objects.get(pk=1)
self.client.post(reverse('item_detail', kwargs={'pk': item.pk}))
self.assertNotEquals(user.money, 100000)
Изменения были сохранены в БД, но ваш объект все еще содержит старые данные, вызовите instance.refresh_from_db() для получения последних данных из БД
def test_if_change_field_money_after_purchase(self):
self.client.login(username='testuser', password='12345')
user = Profile.objects.get(user__username='testuser')
item = Item.objects.get(pk=1)
user.refresh_from_db()
self.assertNotEquals(user.money, 100000)