【发布时间】:2016-08-03 04:41:19
【问题描述】:
我正在尝试使用 PhpUnit / Mockery / Laravel 进行单元测试。 这并不容易。看了几十篇教程,还是无法应用到现实生活场景中。
我将展示一段我想测试的代码。谁能告诉我如何测试SoldProductModifier类的方法modifyBasedOnItemCode()?
先解释几句: 我希望用户能够输入产品代码(项目代码)和数量,并且我希望系统自动更新 SoldProduct 模型的 product_id 和 category_id 属性。为此,我创建了我现在要测试的类。
另请参阅: simplified diagram for my database (only tables related to my question)
现在相关代码:
要测试的类
使用应用\模型\产品; 类SoldProductModifier { 私人 $sold_product; 公共函数 __construct(SoldProduct $sold_product) { $this->sold_product = $sold_product; } 公共函数 modifyBasedOnItemCode($item_code) { if (!isset($item_code) || $item_code == '') { $product = Product::findByItemCode($item_code); if (isset($product) && $product != false) { $this->sold_product->category_id = $product->category->id; $this->sold_product->product_id = $product->id; } } 返回 $this->sold_product; } }产品型号
... 公共静态函数 findByItemCode($item_code) { return self::where('item_code', $item_code)->first(); } ...我的控制器引用了 SUT
... $sold_product = new SoldProduct($request->all()); $modifier = new SoldProductModifier($sold_product); $sold_product = $modifier->modifyBasedOnItemCode($request->item_code); $sold_product->保存(); ...我的测试课
类 SoldProductModifierTest 扩展 TestCase { 公共函数设置() { 父::setUp(); $this->soldProductMock = $this->mock('App\Models\SoldProduct'); $this->productMock = $this->mock('App\Models\Product'); } 公共函数拆解() { 嘲弄::close(); } 公共函数 testDoesNotModifyIfItemCodeEmpty() { $soldProductModifier = new SoldProductModifier($this->soldProductMock); $modifiedSoldProduct = $soldProductModifier->modifyBasedOnItemCode(''); $this->assertEquals($this->soldProductMock, $modifiedSoldProduct); } 公共函数 testModifiesBasedOnItemCode() { // 我如何测试积极的情况? ...我粘贴了我的第一个测试,以防有人认为它不应该这样做,并且愿意建议另一种解决方法。
但现在我的问题是:
如何在此处模拟对数据库的调用:Product::findByItemCode($item_code)?
我是否应该在我的 SoldProductModifier 中创建一个 $product 属性并使用为此目的创建的 setter 方法设置它,例如:
公共函数 setProduct(Product $product) { $this->product = $product; }然后在我的控制器中添加额外的行:
... $modifier = new SoldProductModifier($sold_product); $modifier->setProduct(Product::findByItemCode($item_code)); // --- 额外的行 $sold_product = $modifier->modifyBasedOnItemCode(); // --- 参数被移除 ...?
我尽量让我的控制器保持纤薄,所以想避免这种情况? 那么解决这种情况的最佳方法是什么?
谢谢
【问题讨论】:
标签: php unit-testing laravel mockery