質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

Q&A

0回答

2367閲覧

Laravel dusk でのテストでassertSeeメソッドとtypeメソッドが失敗する。

KeishiHashimoto

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

0グッド

0クリップ

投稿2021/10/15 01:37

編集2021/10/15 09:42

前提・実現したいこと

laravel dusk でのテスト実行時に、assertSee, typeなどのビューの内容を参照するテストが通らない。

発生している問題・エラーメッセージ

エラーメッセージ① Did not see expected text [以下の情報を入力してください] within element [body].
エラーメッセージ② Facebook\WebDriver\Exception\NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"body email"}

該当のソースコード

PHP

1【テストコード】 2<?php 3 4namespace Tests\Browser; 5 6use App\Models\User; 7use Illuminate\Foundation\Testing\DatabaseMigrations; 8use Laravel\Dusk\Browser; 9use Tests\DuskTestCase; 10use Illuminate\Foundation\Testing\WithoutMiddleware; 11use App\Http\Middleware\BasicAuthMiddleware; 12 13class SignInTest extends DuskTestCase 14{ 15 # use WithoutMiddleware; 16 use DatabaseMigrations; 17 /** 18 * A Dusk test example. 19 * 20 * @return void 21 */ 22 public function testLogin() 23 { 24 $user = User::factory()->create(); 25 $this->browse(function ($browser) use ($user) { 26 $browser->visit("/login") 27 ->assertPathIs("/login") 28 ->assertSee("以下の情報を入力してください") 29 ->type('email', $user->email) 30 ->type('password', $user->password) 31 ->press("ログインする") 32 ->assertPathIs("/home"); 33 }); 34 } 35}

PHP

1【該当のビュー】 2@extends('layouts.app') 3 4@section('content') 5<div class="container"> 6 <div class="row justify-content-center"> 7 <div class="col-md-8"> 8 <div class="card"> 9 <div class="card-header">以下の情報を入力してください</div> 10 11 <div class="card-body"> 12 <form method="POST" action="{{ route('login') }}"> 13 @csrf 14 15 <div class="form-group row"> 16 <label for="email" class="col-md-4 col-form-label text-md-right">メールアドレス</label> 17 18 <div class="col-md-6"> 19 <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus> 20 21 @error('email') 22 <span class="invalid-feedback" role="alert"> 23 <strong>{{ $message }}</strong> 24 </span> 25 @enderror 26 </div> 27 </div> 28 29 <div class="form-group row"> 30 <label for="password" class="col-md-4 col-form-label text-md-right">パスワード</label> 31 32 <div class="col-md-6"> 33 <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password"> 34 35 @error('password') 36 <span class="invalid-feedback" role="alert"> 37 <strong>{{ $message }}</strong> 38 </span> 39 @enderror 40 </div> 41 </div> 42 43 <div class="form-group row"> 44 <div class="col-md-6 offset-md-4"> 45 <div class="form-check"> 46 <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}> 47 48 <label class="form-check-label" for="remember"> 49 ログイン状態を維持する 50 </label> 51 </div> 52 </div> 53 </div> 54 55 <div class="form-group row row-cols-1 mb-0"> 56 <div class="col text-right"> 57 <button type="submit" class="btn btn-link"> 58 <i class="fas fa-directions fa-fw"></i>ログインする 59 </button> 60 </div> 61 <div class="col text-right"> 62 @if (Route::has('password.request')) 63 <a class="btn btn-link text-secondary" href="{{ route('password.request') }}">パスワードをお忘れの場合はこちら</a> 64 @endif 65 </div> 66 </div> 67 </form> 68 </div> 69 </div> 70 </div> 71 </div> 72</div> 73@endsection 74

試したこと

・該当のビューには("/login")へのリクエストで遷移可能です。
assertPathIsで確認しているので、目的のページへの遷移は行えているものの、意図している文字列やinput要素が表示されていない、という結果です。

【エラーメッセージ①に関して】
念のためにassertSeeの部分を以下のように変更してテストを行いましたが、結果は同じでした。

PHP

1->assertSee("<div>以下の情報を入力してください</div>")

【エラーメッセージ②に関して】
・上記のコードをそのまま実行した際には、エラーメッセージ①が表示されます。
->assertSee("以下の情報を入力してください")の部分をコメントアウトした際には②のエラーが出ます。

・該当のinput要素にdusk属性を付与してもテストは通らないままでした。

PHP

1Facebook\WebDriver\Exception\NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"body [dusk="email"]"} 2

【テストコードに記述されているコメントアウトの"use WithoutMiddleware"に関して】
この部分は、middlewareに設定しているBasic認証に関するものです。
Basic認証のポップアップが邪魔をしているのかと思い、念のためWithoutMiddlewareありでもテストを行いました。
ただ、コメントアウトの有無に関わらず結果は同じでした。

以下、Basic認証に関するソースコードです。

PHP

1【Middleware】 2<?php 3 4namespace App\Http\Middleware; 5 6use Closure; 7use Illuminate\Http\Request; 8 9class BasicAuthMiddleware 10{ 11 /** 12 * Handle an incoming request. 13 * 14 * @param \Illuminate\Http\Request $request 15 * @param \Closure $next 16 * @return mixed 17 */ 18 public function handle(Request $request, Closure $next) 19 { 20 $username = $request->getUser(); 21 $password = $request->getPassword(); 22 if($username == config("app.BASIC_AUTH_USER") && $password == config("app.BASIC_AUTH_PASSWORD")){ 23 return $next($request); 24 } 25 abort(401, "Enter username and password.", [ 26 header('WWW-Authenticate: Basic realm="Sample Private Page"'), 27 header('Content-Type: text/plain; charset=utf-8') 28 ]); 29 } 30} 31

PHP

1【Kernel・該当部分のみ】 2protected $routeMiddleware = [ 3 'auth' => \App\Http\Middleware\Authenticate::class, 4 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 5 6 "basicauth" => \App\Http\Middleware\BasicAuthMiddleware::class,// ここが該当部分 7 8 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 9 'can' => \Illuminate\Auth\Middleware\Authorize::class, 10 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 11 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 12 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 13 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 14 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 15 ];

PHP

1【web.php】*全てのルーティングに対してBasic認証を設定しています。 2 3Route::group(["middleware" => "basicauth"], function(){ 4 5 Route::get('/', function () { 6 return view('home'); 7 }); 8 9 Auth::routes(); 10 11 Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); 12 13 Route::resource("users", UserController::class); 14 15 Route::get("user_licenses/edit", [UserLicenseController::class, "edit"])->name("user_licenses.edit"); 16 Route::patch("user_licenses/update", [UserLicenseController::class, "update"])->name("user_licenses.update"); 17 Route::get("user_licenses/create", [UserLicenseController::class, "create"])->name("user_licenses.create"); 18 Route::post("user_licenses", [UserLicenseController::class, "store"])->name("user_licenses.store"); 19 20 Route::get("/user_pays/create", [UserPayController::class, "create"])->name("user_pays.create"); 21 Route::post("/user_pays", [UserPayController::class, "store"])->name("user_pays.store"); 22 Route::get("/user_pays/edit", [UserPayController::class, "edit"])->name("user_pays.edit"); 23 Route::patch("user_pays/update", [UserPayController::class, "update"])->name("user_pays.update"); 24 25 Route::get("/user_papers/create", [UserPaperController::class, "create"])->name("user_papers.create"); 26 Route::post("/user_papers", [UserPaperController::class, "store"])->name("user_papers.store"); 27 Route::get("/user_papers/edit", [UserPaperController::class, "edit"])->name("user_papers.edit"); 28 Route::patch("/user_papers/update", [UserPaperController::class, "update"])->name("user_papers.update"); 29 30 Route::resource("memos", MemoController::class); 31});

補足情報(FW/ツールのバージョンなど)

【バージョンなど】
Laravel8を使用しています。

初めての質問になるので足りない情報などあればおっしゃってください。
よろしくお願いいたします。

10/15追記

フルパスにすれば良いのではないか、とのご指摘をいただいたので、その実施結果を追記しました。

【テストコードの変更点】

PHP

1public function testLogin() 2{ 3$user = User::factory()->create(); 4$this->browse(function ($browser) use ($user) { 5$browser->visit("http://localhost:8000/login") 6->assertPathIs("/login") 7->assertSee("以下の情報を入力してください") 8->type('email', $user->email) 9->type('password', $user->password) 10->press("ログインする") 11->assertPathIs("/home"); 12}); 13}

【エラー1:上記のテストを実行した際に発生】

Did not see expected text [以下の情報を入力してください] within element [body]. Failed asserting that false is true.

【エラー2:assertPathIsメソッドの引数もフルパスにした場合に発生】

Actual path [/login] does not equal expected path [http://localhost:8000/login]. Failed asserting that '/login' matches PCRE pattern "/^http\://localhost\:8000/login$/u".

引き続き自分でも色々と調べてみます。
ご回答ありがとうございました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KeishiHashimoto

2021/10/15 09:43 編集

ご回答ありがとうございます。 ご指摘いただいた内容を実施した結果を本文中に追記いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問