单元测试 DB:: 在 Laravel 中使用 PhpUnit 调用

纳加尔

我是 TDD 的新手。我正在编写一个小包,它用数据库中的值插入一个字符串。到目前为止,我设法编写了大部分测试,但现在我陷入困境,因为我需要测试对数据库的调用。我想测试一个类,该类在给定表、列和 ID 的情况下检索数据库中的特定行。然后它应该返回该实例列值。

class DatabaseResolver
{
    private $referredField;
    private $dependencies;

    public function __construct(ReferredField $referredField, array $dependencies)
    {
        $this->referredField = $referredField;
        $this->dependencies = $dependencies;
    }

    public function resolve() : string
    {
        if(!isset($this->dependencies['id'])) {
            throw new MissingDependencyException('id');
        }

        $instance = $this->getTargetedInstance();
        if ($instance) {
            return $instance->{$this->referredField->column};
        }
        return '';
    }

    public function getTargetedInstance()
    {
        return DB::table($this->referredField->table)
            ->select($this->referredField->column)
            ->where('id', $this->dependencies['id'])
            ->first();
    }
}

我已经设法测试它在依赖项数组中没有 id 时抛出我的异常,并且在未找到令牌时返回原始句子:

    /** @test */
    public function it_will_throw_if_no_id_is_present_in_dependency()
    {
        $this->expectException(MissingDependencyException::class);

        $rf = ReferredField::newFactory()->testAsTable()->create();
        $rf->getReferredValue([]);
    }

    /** @test */
    public function it_returns_blanked_tokens_when_referred_field_is_not_found()
    {
        $stringToInterpolate = 'This is a {{adj}} day!';
        $interpolatedString = $this->interpoler->interpolate($stringToInterpolate, ['adj' => ['id' => -1]]);

        $this->assertEquals('This is a  day!', $interpolatedString);
    }

编辑:这是 Interpoler 类的代码:

<?php

namespace Armcanada\LaravelReferredField\Concerns;

use Armcanada\LaravelReferredField\Exceptions\MissingDependencyException;

class Interpoler
{
    private $tokenizer;
    private $mapper;

    public function __construct(Tokenizer $tokenizer = null, TokenReferredFieldMapper $mapper = null)
    {
        $this->tokenizer = $tokenizer ?: new Tokenizer;
        $this->mapper = $mapper ?: new TokenReferredFieldMapper;
    }

    public function interpolate(string $text, array $dependencies = []) : string
    {
        $map = $this->getReferredFieldsFromText($text);
        $replacedMap = $map->mapWithKeys(function($referredField, $token) use($dependencies) {
            if (!isset($dependencies[$token])) {
                throw new MissingDependencyException($token);
            }
            $key = str_replace(' ', $token, config('laravel-referred-field.interpolation_pattern'));
            return [$key => $referredField?->getReferredValue($dependencies[$token]) ?? null];
        });
        
        $replacedMap->map(function($newValue, $token) use(&$text) {
            $text = str_replace($token, $newValue, $text);
        });
        return $text;
    }

    public function getReferredFieldsFromText($text)
    {
        $tokens = $this->tokenizer->extract($text);
        return $this->mapper->mapTokensToReferredFields($tokens);
    }

}

我的 ReferredField 模型:

<?php

namespace Armcanada\LaravelReferredField\Models;

use Armcanada\LaravelReferredField\Database\Factories\ReferredFieldFactory;
use Armcanada\LaravelReferredField\Resolvers\DatabaseResolver;
use Armcanada\LaravelReferredField\Traits\Referrable;
use Illuminate\Database\Eloquent\Model;

class ReferredField extends Model
{
    use Referrable;

    protected $guarded = [];
    protected $table = 'referred_fields';

    protected static function newFactory()
    {
        return ReferredFieldFactory::new();
    }

    public function getReferredValue(array $dependencies) : string
    {
        $resolver = $this->getResolver($dependencies);

        return $resolver->resolve();
    }

    private function getResolver($dependencies)
    {
        if ($this->table !== null) {
            return new DatabaseResolver($this, $dependencies);
        }
        //return new HandlerResolver($this, $dependencies);
    }

}

我如何测试这条路径?

$instance = $this->getTargetedInstance();
if ($instance) {
    return $instance->{$this->referredField->field};
}
政府间工作组

我不完全确定我理解你的代码,但如果你想测试$instance不为空的路径,你可以部分模拟DatabaseResolver'sgetTargetedInstance方法。

public function test_insert_test_method_name_here()
{
    $rf = ReferredField::factory()->create();

    $this->partialMock(DatabaseResolver::class)
         ->shouldReceive('getTargetedInstance')
         ->andReturn((object) [$rf->column => 'nice']);

    $stringToInterpolate = 'This is a {{ adj }} day!';
    $interpolatedString = $this->interpoler->interpolate($stringToInterpolate, ['adj' => ['id' => -1]]);

    $this->assertEquals('This is a nice day!', $interpolatedString);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

单元测试-如何使用Spring MockMVC调用Soap服务

Laravel-如何在PHPUnit测试中使用faker?

如何在Laravel中使用phpunit测试特定的测试类

如何在与Jest的react-native中使用模拟的fetch()对API调用进行单元测试

使用Spock在单元测试中获得“调用太少”

使用Mock对Laravel 5 Mail进行单元测试

使用PHPUnit在Laravel Controller中进行单元测试

是否可以使用PHPUnit对除类文件以外的php文件进行单元测试?

对在Swift中使用REST调用的方法进行单元测试

Laravel和PHPUnit:单元测试“护照”受限路线时获得500

Laravel和PHPUnit:单元测试“护照”受限路线时获得500

使用Mockito进行单元测试改造API调用-ArgumentCaptor

Laravel使用phpunit + multiprocess测试登录凭证

如何使用laravel队列邮件编写单元测试?

PHPUnit Laravel:如何对自定义异常处理程序进行单元测试?

如何使用phpunit单元测试在已测试类的构造函数中调用的方法

在Laravel 5.5中使用视图创建单元测试邮件后将无法使用

如何使用Mockito在单元测试中调用AppCompatActivity onCreate

在Django Oscar中使用单元测试调用的视图中的访问篮

如何使用PhpUnit使用Laravel测试服务?

Laravel单元测试

使用Laravel assertDatabaseHas和浮点列进行单元测试

如何使用PHPUnit对类型提示进行单元测试

我们可以在 Kotlin 单元测试中使用代码调用活动吗

使用 DarkSkyApi 调用进行 Angular 2 服务单元测试

在所有其他单元测试 (phpunit) 之前在 Laravel 中运行特定的单元测试

如何在 Laravel 5 中使用 Codeception 在单元测试中模拟身份验证用户?

在 Laravel 中使用 Model::Find 进行单元测试失败

可以在单元测试中使用 fakeiteasy 使用 3 个类型参数调用“事件操作 <>”