qunit-bdd | BDD-style testing for QUnit | Functional Testing library
kandi X-RAY | qunit-bdd Summary
Support
Quality
Security
License
Reuse
Currently covering the most popular Java, JavaScript and Python libraries. See a Sample Here
qunit-bdd Key Features
qunit-bdd Examples and Code Snippets
Trending Discussions on Functional Testing
Trending Discussions on Functional Testing
QUESTION
I have created a simple hello world app and here is the spec to test withconfirm block.
It is throwing the error when i run the functional test.
No signature of method: geb.navigator.NonEmptyNavigator.getJs() is applicable for argument types: () values: []
Possible solutions: getX(), getY(), getX(), getY(), getAt(groovy.lang.EmptyRange), getAt(groovy.lang.Range)
groovy.lang.MissingMethodException: No signature of method: geb.navigator.NonEmptyNavigator.getJs() is applicable for argument types: () values: []
Possible solutions: getX(), getY(), getX(), getY(), getAt(groovy.lang.EmptyRange), getAt(groovy.lang.Range)
at geb.navigator.NonEmptyNavigator.methodMissing(NonEmptyNavigator.groovy:558)
at geb.content.PageContentSupport.methodMissing(PageContentSupport.groovy:35)
The line where the error is thrown is the withConfirm block. Why is it throwing this error? According to the docs
The first method, withConfirm() (and its ‘ok’ defaulted relative), is used to verify actions that will produce a confirm dialog. This method returns the confirmation message. The ok parameter controls whether the “OK” or “Cancel” button should be clicked.
and the example from the docs is
assert withConfirm(true) { $("input", name: "showConfirm").click() } == "Do you like Geb?"
http://www.gebish.org/manual/2.3/
I appreciate any help. Thanks!
If it is relevant i am using the following version chrome driver.
webdriverBinaries {
chromedriver {
version = '100.0.4896.20'
architecture = 'X86'
}
geckodriver '0.24.0'
}
ANSWER
Answered 2022-Apr-16 at 07:42The missing method should point to the js-object (https://www.gebish.org/manual/current/#js-object).
You are using some outdated versions. After Update some dependencies to a consistent level in the build.gradle, the tests will run.
testCompile "org.seleniumhq.selenium:selenium-remote-driver:3.141.59"
testCompile "org.seleniumhq.selenium:selenium-api:3.141.59"
testCompile "org.seleniumhq.selenium:selenium-support:3.141.59"
testRuntime "org.seleniumhq.selenium:selenium-chrome-driver:3.141.59"
testRuntime "org.seleniumhq.selenium:selenium-firefox-driver:3.141.59"
testCompile 'org.gebish:geb-core:4.1'
testCompile 'org.gebish:geb-spock:4.1'
Than you can add a assertion to your spec (BookSpec):
withConfirm(true) {
$("#btn").click()
}
Btw. our grailsw is outdated: https://grails.org/blog/2021-06-10-grails-wrapper-update.html
QUESTION
When you're using the app through the browser, you send a bad value, the system checks for errors in the form, and if something goes wrong (it does in this case), it redirects with a default error message written below the incriminated field.
This is the behaviour I am trying to assert with my test case, but I came accross an \InvalidArgumentException I was not expecting.
I am using the symfony/phpunit-bridge with phpunit/phpunit v8.5.23 and symfony/dom-crawler v5.3.7. Here's a sample of what it looks like :
public function testPayloadNotRespectingFieldLimits(): void
{
$client = static::createClient();
/** @var SomeRepository $repo */
$repo = self::getContainer()->get(SomeRepository::class);
$countEntries = $repo->count([]);
$crawler = $client->request(
'GET',
'/route/to/form/add'
);
$this->assertResponseIsSuccessful(); // Goes ok.
$form = $crawler->filter('[type=submit]')->form(); // It does retrieve my form node.
// This is where it's not working.
$form->setValues([
'some[name]' => 'Someokvalue',
'some[color]' => 'SomeNOTOKValue', // It is a ChoiceType with limited values, where 'SomeNOTOKValue' does not belong. This is the line that throws an \InvalidArgumentException.
)];
// What I'd like to assert after this
$client->submit($form);
$this->assertResponseRedirects();
$this->assertEquals($countEntries, $repo->count([]));
}
Here's the exception message I get :
InvalidArgumentException: Input "some[color]" cannot take "SomeNOTOKValue" as a value (possible values: "red", "pink", "purple", "white").
vendor/symfony/dom-crawler/Field/ChoiceFormField.php:140
vendor/symfony/dom-crawler/FormFieldRegistry.php:113
vendor/symfony/dom-crawler/Form.php:75
The ColorChoiceType tested here is pretty standard :
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'choices' => ColorEnumType::getChoices(),
'multiple' => false,
)];
}
What I can do, is to wrap in a try-catch block, the line where it sets the wrong value. And it would indeed submit the form and proceed to the next assertion. The issue here is that the form was considered submitted and valid, it forced an appropriate value for the color field (the first choice of the enum set). This is not what I get when I try this in my browser (cf. the intro).
// ...
/** @var SomeRepository $repo */
$repo = self::getContainer()->get(SomeRepository::class);
$countEntries = $repo->count([]); // Gives 0.
// ...
try {
$form->setValues([
'some[name]' => 'Someokvalue',
'some[color]' => 'SomeNOTOKValue',
]);
} catch (\InvalidArgumentException $e) {}
$client->submit($form); // Now it submits the form.
$this->assertResponseRedirects(); // Ok.
$this->assertEquals($countEntries, $repo->count([])); // Failed asserting that 1 matches expected 0. !!
How can I mimic the browser behaviour in my test case and make asserts on it ?
ANSWER
Answered 2022-Apr-05 at 11:17It seems that you can disable validation on the DomCrawler\Form component. Based on the official documentation here.
So doing this, now works as expected :
$form = $crawler->filter('[type=submit]')->form()->disableValidation();
$form->setValues([
'some[name]' => 'Someokvalue',
'some[color]' => 'SomeNOTOKValue',
];
$client->submit($form);
$this->assertEquals($entriesBefore, $repo->count([]); // Now passes.
QUESTION
I have a two classes let's say classA and classB. classA calls a method in classB which saves some value in a database using the DaoClass.
I have to test if the values are getting saved in database.
@Mocks
private DaoClass dao;
@Mocks
private ClassB B;
@InjectMocks
private ClassA A;
A.someMethod(someArgument);
verify(B).someOtherMethod(someOtherArgument);
verify(dao).save(theCorrectValue);
This fails saying there were zero interactions with this mock. Wanted but not invoked dao.save(). Whereas B.someOtherMethod() was invoked.
I am new to development and testing and my understanding was that I just have to mock call a method in my first class and then that call would proceed like a normal call and all the methods in all the other classes would be called normally. But it seems that it only calls a method in classB and then does not do anything in classB. For example, I debugged by creating breakpoints all over ClassB:
ClassB someOtherMethod{
SomeCode;
SomeCode;
dao.save();
someCode;
return Something; }
In debugger I can see it goes to ClassB someOtherMethod() but after that it skips all the code and goes to return statement. Am I missing something? Do I need to go through some documents?
ANSWER
Answered 2022-Feb-15 at 22:42You would have to either
- stub the ClassB someOtherMethod. Note that if you don't specify the return value of any of the mocked dependencies (with when()) it will return the default value for the return type - null for objects, 0 for primitive numbers, false for boolean, etc. This is why you must be getting Null when someOtherMethod is called.
- Use Spy instead of Mock. if you want to call external service and perform calling of real dependency, or simply say, you want to run the program as it is and just stub specific methods, then use spy.
QUESTION
I am testing my django app with django TestCase class. For unit tests and integrations tests I encountered no problem with the database django create then destroy for the tests. But now i want to do some functional test using selenium. The problem is that selenium seem to not be able to access the db. Here is the test code of my test :
class HostTest(LiveServerTestCase, TestCase):
def setUp(self):
self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# Setting up temporary test database
# Setting up products
self.product1 = Product.objects.create(
id=1,
name="apple",
url="apple_url",
nutriscore="A",
img_url="apple_img_url",
kcal=101,
fat=201,
protein=301,
sugar=401,
)
def tearDown(self):
self.driver.close()
def test_new_user_reserach_and_add_favorite(self):
driver = self.driver
driver.get(self.live_server_url)
self.assertIn("Accueil", driver.title)
search_bar = driver.find_element_by_name("product_searched")
search_bar.send_keys("apple")
search_bar.send_keys(Keys.ENTER)
self.assertIn("Recherche", driver.title)
product = driver.find_element_by_class_name('product-presentation')
For this I have an error at the last line, and the error is long but its basically tell me that selenium cant find the element. I tried to print product1 in the test and it work. That why I'm pretty sure that the problem is with Selenium.
Here is the code of my view :
def product_research(request):
no_repetition_result = []
vectors = SearchVector('name', weight='A') + SearchVector('category__name', weight='B')
query = SearchQuery(f'{request.GET.get("product_searched")}')
research_result = Product.objects.annotate(rank=SearchRank(vectors, query)).order_by('-rank')
for product in research_result:
if product not in no_repetition_result:
no_repetition_result.append(product)
context = {
"results": no_repetition_result,
}
request.session['research_parameter'] = request.GET.get("product_searched")
return render(request, 'main_site/product_research.html', context)
And the html code charged to make appear the product on my web page :
Note: When I take a look at the code of the page selenium open while testing, I dont see any product.
ANSWER
Answered 2022-Jan-30 at 15:55Check this answer
This is the same problem that you are facing and has a clean explanation.
QUESTION
I have an app that fetches a list of users and displays them. The app works as expected but the test fails:
Users.js
import React from 'react';
function Users() {
const [users, setUsers] = React.useState([]);
React.useEffect(() => {
fetch('https://jsonplaceholder.typicode.com/users')
.then(response => response.json())
.then(data => setUsers(data))
}, [])
return (
{users.map(user => {
return (
{user.name}
)
})}
);
}
export default Users;
I've setup MSW using the steps outlined here.
handlers.js
import { rest } from 'msw';
export const handlers = [
rest.get('https://jsonplaceholder.typicode.com/users', (req, res, ctx) => {
return res(
ctx.json([
{ id: 1, name: 'Xabi Alonzo' },
{ id: 2, name: 'Lionel Messi' }
])
)
})
];
server.js
import { setupServer } from 'msw/node';
import { handlers } from './handlers';
export const server = setupServer(...handlers);
setupTests.js
import '@testing-library/jest-dom';
import { server } from './mocks/server.js';
beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());
Users.test.js
import { render, screen } from '@testing-library/react';
import Users from './Users';
test('Renders a list of users', () => {
render();
const text = screen.getByText('Xavi Alonzo');
expect(text).toBeInTheDocument();
});
What am I missing? The output of the test render doesn't show the mock response data.
TestingLibraryElementError: Unable to find an element with the text: Xavi Alonzo
ANSWER
Answered 2022-Jan-23 at 06:48There are two problems in Users.test.js
- Need to add async/await
- Use findByText instead of getByText
With these changes, the test passes:
test('Renders a list of users', async () => {
render();
const text = await screen.findByText('Xabi Alonzo');
expect(text).toBeInTheDocument();
});
Look at the documentation for the difference between getBy... and findBy...
QUESTION
I have a controller end-point that does an external API request under hood which I can't really make each time I run tests.
I'm using HttpClientInterface
to make the request and now my idea is to replace it with MockHttpClient
. So here is what I have so far:
class MyControllerTest extends WebTestCase
{
public function testSomething(): void
{
$client = static::createClient();
$response = new MockResponse(null, ['http_code' => 200]);
$client->getContainer()->set(HttpClientInterface::class, new MockHttpClient($response));
$client->request('GET', '/my-end-point');
self::assertResponseIsSuccessful();
}
}
But it gives me the following error:
The "Symfony\Contracts\HttpClient\HttpClientInterface" service is private, you cannot replace it
which is kinda makes sense. Is there a better solution or how to overcome the problem?
ANSWER
Answered 2022-Jan-19 at 16:14In a Symfony environment services are private, but this is not a problem because you are getting them in your controllers, services, etc through Dependency Injection, meaning that it is Symfony itself that takes care of it.
When trying to test, you may end up, like in your case, setting the mocked class in your container directly.
This will throw the error you see.
To overcome this error, in your services.yaml file located in the config folder, just add the following lines at the bottom:
when@test:
services:
_defaults:
public: true
test.Symfony\Contracts\HttpClient\HttpClientInterface: '@Symfony\Contracts\HttpClient\HttpClientInterface'
what you are doing here, is telling Symfony that during tests you will have a public Service called test.Symfony\Contracts\HttpClient\HttpClientInterface that it is a copy of the HTTPClientInterface class.
Now, in your test code you can do the following:
$response = new MockResponse(null, ['http_code' => 200]);
$client->getContainer()->set('test.Symfony\Contracts\HttpClient\HttpClientInterface', new TraceableHttpClient(new MockHttpClient($response)));
QUESTION
i'm trying to test a form with a PRE_SUBMIT Form my FormType Class looks like this:
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('productType', ChoiceType::class, [
'choices' => [
'Software' => 'software',
'Television' => 'television',
'Giftcard' => 'giftcard',
'Bitte wählen' => '',
],
])
->add('productNumber', TextType::class)
->add('title', TextType::class)
->add('submit', SubmitType::class);
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event)
{
$form = $event->getForm();
$data = $event->getData();
if ($data['productType'] === 'giftcard') {
$form->add('value', TextType::class);
}
}
);
}
i have no clue how to do it, i only can reach the field value if i submit the form like this.
$client->submitForm('Submit', [
'product[productType]' => 'giftcard',
'product[productNumber]' => 'C123123',
'product[title]' => 'TestCard',
]);
i cant do a second submit like this. But the form looks fine after the first submit. Hopefully someone can help me or give me some advice.
ANSWER
Answered 2021-Oct-20 at 12:08i did it like this with a pre submitted form. Now its working fine. If you want to add a new value with this event you shut take the crawler again after the first submit and add the value to the form.
public function testRedirectAfterCreateGiftcard(): void
{
$client = static::createClient([
'debug' => false,
]);
$crawler = $client->request('GET', 'https://localhost/product/create');
$client->followRedirects();
$form = $crawler->selectButton('Submit')->form();
$values = $form->getPhpValues();
$values['product']['productType'] = 'giftcard';
$values['product']['productNumber'] = 'B122222';
$values['product']['title'] = 'Test';
$client->request($form->getMethod(), $form->getUri(), $values, $form->getPhpFiles());
$form->setValues($values);
$client->submitForm('Submit');
$form2 = $client->getCrawler()->selectButton('Submit')->form();
$values2 = $form2->getPhpValues();
$values2['product']['value'] = '25';
$form2->setValues($values2);
$client->submit($form2);
$this->assertRouteSame('app_product_view', ['productType' => 'giftcard']);
}
QUESTION
I am using Spring Data JPA and developed below query which will dynamically take the day values and fetch data, but looks like its arguable looking for Double data type. Any reason why its taking double?
@Query("SELECT new com.XXX.SomeDTODto(p.visitDate, ..........) "
+ "FROM PatientData p "
+ "INNER JOIN ................. "
+ "INNER JOIN ................."
+ "INNER JOIN .................. "
+ "INNER ..... "
+ "WHERE (TRUNC (p.visitDate) >= TRUNC (SYSDATE + :startDay) AND TRUNC (p.visitDate) <= TRUNC (SYSDATE + :endDay))")
Page findByvisitDateBetweenDays(@Param("startDay") Double startDay,
@Param("endDay") Double endDay, Pageable pageable);
I am getting below, functional test cases runs against H2 DB and failing
here TRUNC(patient0_.patient_dt)>=TRUNC(SYSDATE+?) and TRUNC(patient0_.patient_dt)<=TRUNC(SYSDATE+?) order by patient0_.patient_dt asc limit ? [50004-196]
ANSWER
Answered 2021-Sep-14 at 14:40You can use below, this works fine for me, also Integer is getting casted to Double
"WHERE (TRUNC (p.visitDate) >= TRUNC (SYSDATE + CAST(:startDay AS double) + 0) AND TRUNC (p.visitDate) <= TRUNC (SYSDATE + CAST(:endDay AS double) + 0))")
QUESTION
As per my knowledge, should I use multiple CSS extractors for extracting each value?
Here is HTML:
Redirecting
And I have to use name and value in the next sampler from this respone.
Looking for help on this. Let me know if you need any more info on this.
Thanks in advance!!
ANSWER
Answered 2021-Jul-16 at 07:21You can get all value attributes of the hidden input fields in a single CSS Selector Extractor by using input[type=hidden]
CSS selector:
So if you configure CSS Selector Extractor like this:
You will get the following JMeter Variables created:
More information:
QUESTION
I am writing a functional test for a form in phpunit with the DomCrawler Component in a Symfony 5.1 application. I read the docs as well as previous questions (another), but I can't get it to work.
The test should check:
- Login (works)
- Goto user overview (works)
- Click edit for first item in user list (works)
- Check if the data displayed in the form is correct (fails)
I am able to get all attributes of the form input, except for the value attribute. The url of the form edit page is /user-action?user=2
.
My test looks like this:
public function testIfDisplayedInfosAreCorrect()
{
$crawler = $this->client->clickLink('Edit'); // from user overview -> click edit
// $crawler->getUri() returns "/user-action?user=2" at this point (which is fine)
// $crawler->filter('#user_firstname')->attr('class') returns the class names of the form input
// $crawler->filter('#user_firstname')->attr('value') returns null
$form = $crawler->selectButton('Save')->form();
$firstName = $form->get('user[firstname]')->getValue(); // returns null
$this->assertSame("Admin", $firstName); // fails
}
Why can't I get the value of the form element? I hope it's clear what I mean, please let me know otherwise.
Edit: Dumping all values with $form->getValues();
also returns empty strings for all input fields.
Edit 2: The controller looks as following:
/**
* @Route("/user-action", name="app_user_action")
*/
public function createAndEditUser(
Request $request,
EntityManagerInterface $entityManager,
SluggerInterface $slugger,
UserPasswordEncoderInterface $passwordEncoder,
UserHelper $userHelper): Response
{
if(isset($_GET['user'])) {
$user = $entityManager->getRepository(User::class)->find($_GET['user']);
$email = $user->getEmail();
} else {
$user = new User();
$email = '';
}
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
// parse input
// create or edit object
// flush into db
return $this->redirectToRoute('app_users');
}
return $this->render('pages/user/action.html.twig', [
'form' => $form->createView(),
'email' => $email
]);
}
Edit: Solution: Thanks to @DonCallisto's hint to use parameter converters, I removed the $_GET
and used Symonfy's annotations for routing, which solved the problem of not being able to have if(isset($_GET['user']))
resolve to true
.
ANSWER
Answered 2021-Jul-07 at 07:36if(isset($_GET['user']))
will return false
, so you have not a single data inside the form.
BTW you should not use $_GET
, but you can take advantage of ParamConverter and eventually pass user id inside URL.
Community Discussions, Code Snippets contain sources that include Stack Exchange Network
Vulnerabilities
No vulnerabilities reported
Install qunit-bdd
Support
Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from over 650 million Knowledge Items
Find more librariesExplore Kits - Develop, implement, customize Projects, Custom Functions and Applications with kandi kits
Save this library and start creating your kit
Share this Page