首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel 8上的特性测试

Laravel 8上的特性测试
EN

Stack Overflow用户
提问于 2021-03-10 15:41:34
回答 1查看 284关注 0票数 0

我正在尝试用RESTful API编写一个特性测试,这个测试是在laravel 8中创建的。我的ChatController通过getUserChats方法获取用户聊天:

代码语言:javascript
运行
复制
// get chats for user
public function getUserChats()
{
    $chats = $this->chats->getUserChats();
    return ChatShowResource::collection($chats);
}

这条路线叫的:

代码语言:javascript
运行
复制
Route::get('chats', [
    App\Http\Controllers\Chats\ChatController::class, 'getUserChats'
]);

这是我在这条路线上的特性测试:

代码语言:javascript
运行
复制
public function test_get_user_chats()
{
    // creates the fake user
    $user = User::factory()->create();
    $this->actingAs($user, 'api');

    // adds the chat to new fake user that created
    $response_create_chat = $this->json('POST', '/api/chats', [
            'recipient' => $user->username,
            'body' => 'some chat text',
        ]
    );

    $response_create_chat
        ->assertStatus(201)
        ->assertJsonPath('data.body', 'some chat text');

    $response_get_chats = $this->json('get', '/api/chats');

    $response_get_chats->assertStatus(200);
}

该测试由绿色输出OK (1 test, 3 assertions)成功运行,但我不知道这是实现该测试的最佳方法。

所以问题是我在考试中还有什么要做的吗?我在做正确的特性测试吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-12 23:43:53

通常,您希望测试的范围尽可能小。您提供的测试用例目前正在测试两个独立的api端点:

  • 创建聊天
  • 获取聊天

这方面的问题是,如果与创建聊天相关的代码中断,则与获取聊天相关的测试用例将失败。

我建议将它们分成两个单独的测试用例。这将允许您相信,如果获取聊天的测试用例失败了,这是由于与获取聊天失败有关的代码,而不是与此端点无关的代码。

我还建议使用setUptearDown方法来确保您的测试用例使数据库处于与它找到的状态相同的状态。这将确保其他测试用例不必关注来自此测试的数据。这意味着setUp方法应该执行如下操作:

创建users

  • Creating

tearDown方法将负责删除用户和聊天。

此外,还应该测试端点输出的格式和数据。目前,您只需要检查200条响应代码。如果您的api被更新为返回用户列表而不是聊天,那么与获取聊天相关的测试用例仍然会通过,因为它实际上并不验证正在返回的数据。

例:

代码语言:javascript
运行
复制
class GetChatsTest extends TestCase
{
    private User $user;
    
    public function testGetChats(): void
    {
        $chat = $this->json('get', '/api/chats');
        // Check the chat's returned value
        $this->assertSame('Some parameters', $chat);
    }

    protected function setUp(): void
    {
        parent::setUp();
        // Create the user in the setup. This is run before each test method is run.
        $this->user = User::factory()->create();
        // Create the chat for the user (Pseudo code because I don't know how your code works)
        $this->user->createChat('Some parameters');
    }

    protected function tearDown(): void
    {
        parent::tearDown();
        // Delete the user and chats here, pseudocode again. This runs after every test method is run
        $this->user->deleteChats();
        $this->user->delete();
    }
}

关于示例代码,需要注意的一点是,它不使用rest来创建用户或聊天,而是使用伪代码控制器方法来确保它不依赖chat api的功能进行测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66568093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档