Jac*_*ero 6 standards unit-testing naming-conventions laravel eloquent
一个简单的问题:如何区分功能、单元和集成测试?
有很多不同的意见,但我特别试图确定如何组织涉及模型关系的 Laravel 测试。下面是一些需要测试的 PHP 代码的示例:
public function prices()
{
return $this->hasMany(Prices::class);
}
public function getPriceAttribute($)
{
return $this->prices()->first() * 2;
}
Run Code Online (Sandbox Code Playgroud)
我理解的测试描述(请随时纠正我):
单元测试
集成测试
功能测试
鉴于这些描述,这是我的问题:
那么,如果不模拟模型之间的关系,我的测试应该属于哪里?
如果 I\xe2\x80\x99m 正确解释你原来的问题,我认为这里的杀手约束是:
\n\n那么,如果不模拟模型之间的关系,我的测试应该属于哪里?
\n\n如果不允许模拟并且您需要接触数据库,那么根据您/和谷歌的定义,它必须属于集成/中等规模测试:)
\n\n我的想法是获取价格属性功能与数据库是分开的。即使它在模型中,价格也可能来自任何地方。现在它是一个 RDBMS,但是如果您的组织变得非常大并且它分裂成另一个服务怎么办?基本上,我认为, 的功能getPriceAttributes与属性的存储不同:
public function getPriceAttribute($)\n{\n return $this->prices()->first() * 2;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n如果您接受这种推理,它就会创建支持单元测试的逻辑分离。 prices()可以模拟返回 0、1 和多 (2) 个结果的集合。该测试可以作为单元测试来执行(测试执行速度要快几个数量级(即,与本地数据库通信可能需要10 或 100 毫秒,而大约 1 毫秒)
我不熟悉 php 测试生态系统,但一种方法可以是使用特定于测试的子类(不确定以下内容是否有效 PHP :p ):
\n\nclass PricedModel extends YourModel {\n function __construct($stub_prices_supporting_first) {\n $this->stub_prices = $stub_prices_supporting_first;\n }\n\n public function prices() {\n return $this->stub_prices;\n }\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n测试
\n\nfunction test_priced_model_0_prices() {\n p = new PricedModel(new Prices(array()));\n assert.equal(null, p.getPriceAttribute());\n}\n\nfunction test_priced_model_1_price() {\n p = new PricedModel(new Prices(array(1)));\n assert.equal(2, p.getPriceAttribute());\n}\n\nfunction test_priced_model_2_prices() {\n p = new PricedModel(new Prices(array(5, 1)));\n assert.equal(10, p.getPriceAttribute());\n}\nRun Code Online (Sandbox Code Playgroud)\n\n上面的内容应该能让您完全控制方法的输入getPriceAttribute,以支持直接的无 IO 单元测试。
\xe2\x80\x94\xe2\x80\x94\n上述所有单元测试都可以告诉您,您\xe2\x80\x99能够正确处理价格,它不会\xe2\x80\x99对任何反馈进行定价您\xe2\x80\x99可以查询价格!
\n| 归档时间: |
|
| 查看次数: |
3524 次 |
| 最近记录: |