如何使用外键测试 Django 中的模型

2023-12-26

我想确保我正在单独测试模型/对象,而不是作为一个庞大的系统。

如果我有一个订单对象,并且它具有客户、付款、订单项等的外键,并且我想测试订单功能,则需要为所有相关数据创建固定装置,或在代码中创建它。我认为我真正需要做的是模拟其他项目,但如果我对这些外键进行查询,我没有看到一个简单(或可能)的解决方案。

常见的解决方案(夹具)并不能真正让我一次测试一个对象。我确信这部分是由于我的应用程序造成的way过度耦合。

我正在尽最大努力采用 TDD 作为我的主要工作方法,但是从 Django 的工作方式来看,您似乎可以运行非常简单的单元测试,也可以运行这些大规模的集成测试。

[Edit]更好的明确的例子和更多的谦虚

我的意思是I seem能够只运行简单的单元测试。我见过有人拥有经过充分测试和细化的模块。我确信其中一些可以追溯到糟糕的设计。

Example:

我有一个名为 Upsell 的模型,它链接到产品模型。然后我有一个 Choices 模型,它是 Upsell 的子模型(你想要#1、#2、#3 门后面的东西)。

追加销售模型有多种方法,可以从他们的选择中派生出渲染模板所需的项目。最重要的是它为每个选择创建一个 URL。它通过一些字符串修改等来实现这一点。如果我想测试 Upsell.get_urls() 方法,我希望它不依赖于装置中选择的值,并且我不希望它依赖于固定装置中的产品。

现在,我在 setUp 方法中填充数据库以进行测试,这与 Django 每次撤回事务的方式配合得很好,但仅限于 setUp 和 TeaDown 之外。除了某些模型的设置相当复杂之外,这种方法效果相当好,而我实际上只需要为其获取一个属性。

我无法给你一个例子,因为我无法完成它,但这就是我现在正在做的事情。基本上我输入一个完整的订单,创建它所附加的 A/B 实验等。这还不包括由固定装置设置的产品、类别等。这不是我担心的额外工作,因为我什至无法一次测试一个基于数据库的对象。下面的测试很重要,但它们是集成测试。我想通过单独测试每个项目来构建类似的东西。正如您所指出的,也许我不应该选择与数据库密切相关的框架。是否存在任何类型的依赖注入? (超出了我的测试,但也超出了代码本身)

class TestMultiSinglePaySwap(TestCase):
    fixtures = ['/srv/asm/fixtures/alchemysites.json','/srv/asm/fixtures/catalog.json','/srv/asm/fixtures/checkout_smallset.json','/srv/asm/fixtures/order-test-fixture.json','/srv/asm/fixtures/offers.json']

def setUp(self):
    self.o = Order()
    self.sp = SiteProfile.objects.get(pk=1)
    self.c = Customer.objects.get(pk=1)
    signals.post_save.disconnect(order_email_first, sender=Order)
    self.o.customer = self.c
    p = Payment()
    p.cc_number = '4444000011110000'
    p.cc_exp_month = '12'
    p.cc_type = 'V'
    p.cc_exp_year = '2020'
    p.cvv2 = '123'
    p.save()
    self.o.payment = p
    self.o.site_profile = self.sp
    self.o.save()
    self.initial_items = []
    self.main_kit = Product.objects.get(pk='MOA1000D6')
    self.initial_items.append(self.main_kit)
    self.o.add_item('MOA1000D6', 1, False)
    self.item1 = Product.objects.get(pk='MOA1041A-6')
    self.initial_items.append(self.item1)
    self.o.add_item('MOA1041A-6', 1, False)
    self.item2 = Product.objects.get(pk='MOA1015-6B')
    self.initial_items.append(self.item2)
    self.o.add_item('MOA1015-6B', 1, False)
    self.item3 = Product.objects.get(pk='STP1001-6E')
    self.initial_items.append(self.item3)
    self.o.add_item('STP1001-6E', 1, False)
    self.swap_item1 = Product.objects.get(pk='MOA1041A-1')

def test_single_pay_swap_wholeorder(self):
    o = self.o
    swap_all_skus(o)
    post_swap_order = Order.objects.get(pk = o.id)
    swapped_skus = ['MOA1000D','MOA1041A-1','MOA1015-1B','STP1001-1E']
    order_items = post_swap_order.get_all_line_items()
    self.assertEqual(order_items.count(), 4)
    pr1 = Product()
    pr1.sku = 'MOA1000D'
    item = OrderItem.objects.get(order = o, sku = 'MOA1000D') 
    self.assertTrue(item.sku.sku == 'MOA1000D')
    pr2 = Product()
    pr2.sku = 'MOA1015-1B'
    item = OrderItem.objects.get(order = o, sku = 'MOA1015-1B') 
    self.assertTrue(item.sku.sku == 'MOA1015-1B')
    pr1 = Product()
    pr1.sku = 'MOA1041A-1'
    item = OrderItem.objects.get(order = o, sku = 'MOA1041A-1') 
    self.assertTrue(item.sku.sku == 'MOA1041A-1')
    pr1 = Product()
    pr1.sku = 'STP1001-1E'
    item = OrderItem.objects.get(order = o, sku = 'STP1001-1E') 
    self.assertTrue(item.sku.sku == 'STP1001-1E')

请注意,尽管我尝试过,但我从未真正使用过 Mock 框架。所以我也可能从根本上错过了一些东西。


调查模范妈妈 https://pypi.python.org/pypi/model_mommy。它可以自动创建带有外键的对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用外键测试 Django 中的模型 的相关文章

随机推荐

  • qt Creator 调试速度慢

    我正在 Windows 7 64 位上运行基于 Qt 4 7 4 的 Qt Creator 2 3 0 当我从 Qt Creator ctrl r 运行该应用程序时 一切都运行良好 然而 当我调试 F5 时 执行每一行都需要很长时间 有时执
  • 修改ISAPI和CGI扩展

    我的 IIS 服务器有问题 如何使用 C 语言修改 ISAPI 元素 例如 ASP net V4 0 限制为 不允许 我想设置为 允许 如下图所示 我可以使用此代码添加元素 但我无法修改 using System using System
  • JSON - 斜杠不转义

    这是我的 PHP Json 脚本
  • 如何禁用警告数据表警告从行的数据源请求未知参数

    我的数据表中有两行 如下所示 tr td td td td td td tr tr td td tr 这些行对于数据表上的每条记录都会重复 正如您可以想象的那样 我总是收到此错误 并且只需要禁用它 除非您想弄清楚如何使其工作 那么如何禁用警
  • R 包文档:链接到整个包,而不是函数

    我想在我正在开发的一些函数的文档中引用另一个包 整个包 而不仅仅是其中的一个函数 我正在使用 Roxygen2 注释来记录我的包功能 我找不到使用 Roxygen2 创建整个第三方包的链接的方法 要链接到一个包函数 可以这样写 pkg fu
  • TDD:在重构代码的同时破坏所有现有的测试用例

    我已经开始在我的项目中遵循 TDD 但自从我开始 即使读了一些文章 我也很困惑 因为发展速度变慢了 每当我重构代码时 我都需要更改之前编写的现有测试用例 否则它们将开始失败 下面是我最近重构的一个类的例子 public class Sala
  • 如何使用 Javascript 进行替换和追加

    我有一个评论系统 我想在其中实现内联编辑 当有人知道一个好的插件或类似的东西时 请毫不犹豫地给我一个名字 并找到一个 Javascript 片段 它将文本替换为文本区域和文本作为该文本区域的值 但现在我需要向该文本区域添加一个按钮 提交按钮
  • Azure 应用服务 - 同步期间日期时间更改

    我正在开发一个使用 Xamarin Forms 和 Azure 应用服务 包括离线同步 的应用程序 在客户端有这样一段代码 appointment StartDate System DateTime Now 假设约会 开始日期是现在2017
  • 找到点击的li号

    我有一个标准清单 ul li a href blah 1 a li li a href blah 2 a li li a href blah 3 a li li a href blah 4 a li ul 还有我的 jQuery ul li
  • 如何加载和解析 SVG 文档

    背景 有许多与读取和解析 SVG 路径相关的未解答问题 用Java读取svg路径数据的最简单方法 https stackoverflow com questions 21973777 回复 使用 batik svg 解析器解析 svg 文件
  • chrome.notifications.update 无法按预期工作

    我有一些进度通知 我只想更新它 但它从 0 到 1 然后保持在 1 这是我的代码 var notifId uuidv4 var i 0 var notifOptions type progress iconUrl img GS icon p
  • 如何使用 AngularJS 动态创建 CSS 类

    我有一个 Angular JS 网站 我在其中使用来自 API 的数据 我想用它来动态创建 CSS 类 然后 该 CSS 类将格式化来自 API 的其他数据 并显示在 Angular JS 页面中 例如 有没有一种方法可以让 Angular
  • 如何在 Angular 中实现 Facebook 像素?

    我需要在一个有角度的项目中实现一个 facebook 像素 我的像素中有index html from src index html
  • 为什么要给 If 语句命名?

    我刚刚发现我可以为 For 和 While 语句命名 我知道如果您想中断或继续特定循环 它很有用 但我为什么要给 If 起个名字呢 看起来没什么用 name if true do something 这样编译没有问题 如果你有一个带有名称的
  • 如果我不提及目标分辨率,除了 @media 之外还有什么其他方法可以使网站做出适当的响应? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道如何制作一个网站 及其所有元素响应以适应不同的屏幕尺寸 字体 图像等 我做了这样的事情 media only screen a
  • 将 PEM 编码的 RSA 私钥转换为 AsymmetryKeyParameter

    我正在尝试 但失败 创建一种构造方法AsymmetricKeyParameter来自 PEM 编码的私钥 我怎样才能完成这个方法 好像是旧版本的BouncyCastle had a pemReader ReadObject 其结果可以被转换
  • 增加可变输入迭代器是否会使旧迭代器值失效?

    进一步满足输出迭代器要求的迭代器称为可变迭代器 不可变迭代器被称为常量迭代器 24 2 1 4 这表明您可以拥有一个可变输入迭代器 它满足输入和输出迭代器的要求 递增输入迭代器后 其旧值的副本不需要取消引用 24 2 3 然而 标准并没有对
  • 如何在多屏幕环境中知道 JFrame 是否在屏幕上

    我的应用程序用于多屏幕环境 应用程序在关闭时存储其位置并从最后一个位置开始 我通过致电获得该职位frame getLocation 如果框架位于主屏幕上或位于主屏幕的右侧 这会给我一个正值 位于主屏幕左侧屏幕上的框架的 X 值为负值 当屏幕
  • Java 枚举报错?

    当我尝试为枚举赋值时 出现以下错误 枚举状态中的构造函数状态不能应用于给定类型 状态 打开 0 为什么会发生这种情况以及如何解决它 到目前为止 这是我的代码 public enum Status STATUS OPEN 0 STATUS S
  • 如何使用外键测试 Django 中的模型

    我想确保我正在单独测试模型 对象 而不是作为一个庞大的系统 如果我有一个订单对象 并且它具有客户 付款 订单项等的外键 并且我想测试订单功能 则需要为所有相关数据创建固定装置 或在代码中创建它 我认为我真正需要做的是模拟其他项目 但如果我对