Я пытаюсь протестировать в сумерках Laravel ссылку, по которой щелкнули, которая вызывает сценарий AJAX JS, который записывает в базу данных и изменяет текст ссылки. Ссылка представляет собой ссылку «Мне нравится» в социальных сетях, и при нажатии на нее текст изменится на «Вам нравится».
Тестовый код
$user = factory(User::class)->create();
factory(Post::class)->create();
$this->browse(function ($browser) use ($user) {
$browser->loginAs($user)
->visit('/dashboard')
->clickLink('Like', 'a');
$test = $browser->script('return $(".like").text();');
$broswer->assertSee('You like this');```
JS code executed
$('.like').on('click', function(event) {
event.preventDefault();
// Get the parent article node
var parent = getClosest(event.target, 'article');
var postId = parseInt(parent.dataset['postid']);
var parentLike = event.target.parentNode;
// console.info(event.target.parentNode.classList);
if (typeof postId == 'number' && postId > 0) {
$.ajax({
method: 'POST',
url: route('like'),
dataType: "json",
data: {
postId: postId,
_token: $('meta[name = "csrf-token"]').attr('content')
}
})
.done(function(data) {
var likeText = updateLikeText(data.message, data.numLikes, parentLike);
event.target.text = likeText;
});
}
});
The link text should change to You Like this but in the test code, the text doesn't change. Accessing the site through the browser and clicking on the link manually works file. How do I tell dusk to execute the JS script
Ваш тест не учитывает время выполнения запроса AJAX.
jQuery имеет свойство, которое указывает, активен ли запрос AJAX.
Вы можете использовать его, чтобы дождаться завершения запроса перед проверкой текста ссылки:
$browser->loginAs($user)
->visit('/dashboard')
->clickLink('Like', 'a');
$browser->waitUntil('!$.active');
$browser->assertSeeIn('.like', 'You like this');
Спасибо Джонас за ваши комментарии. Было несколько вещей, которые мне пришлось добавить в скрипт, поэтому тест настроен следующим образом. Ссылка для клика Мне нужно было добавить тег a ->clickLink('Like', 'a.like'); и AssertSeeIn тот же $browser->assertSeeIn('a.like', 'Вам это нравится');