Testing Rails app with RSpec and Capybara - ruby-on-rails

In testing my rails app (using RSpec and Capybara) I am having troubles testing AngularJS functions (from the Users point of view). Can I not test with only RSpec and Capybara or do I also need something like protractor?
any help would be great! thank you!

You could test with Capybara, so long as you use a driver that supports javascript, such as Selenium or Poltergeist - see https://github.com/jnicklas/capybara#drivers
However, although I'm not an AngularJS user, I do know that it's designed to be testable, and I imagine you'd be much better off using a tool specifically for javascript testing, rather than capybara.

As long as angular provides it's own methods and functionalities you should separate the testing suite into two. The first one, rspec, capybara and rails will be testing just the non-angular pages.
Second one, using a tool like jasmine should be testing the angular behaviour. Both combined provides good coverage of the application.
https://docs.angularjs.org/guide/unit-testing

Related

Can Nightwatch be used to test Rails?

A contractor for our startup installed the Selenium-based Nightwatch testing framework, since our stack is React-heavy. But he told me that it could even be used to test our Rails code. A new contractor said, to the contrary, that Nightwatch couldn't do unit tests of our Rails controllers and models (which makes sense to me).
Who is right? Do you suppose the first programmer had in mind just that we would do end-to-end testing (certain inputs lead to certain outputs), and that we need not test the details of the Rails code? Do we, as I suspect and as the new contractor asserts, need RSpec or some other Ruby-based testing framework to handle our Rails code, if we want to be a TDD shop?
Yes it can be used to test Rails. But only from the outside (only through the Browser). So no Unit/Controller/View Tests.
You'll need MiniTest or Rspec for those.
My two cents (also see comment by #SteveCarey): Since I prefer to stick with what comes with Rails and use as little external tools as possible:
Have a look at System Tests that have been introduced with Rails 5.1 or, if you are on a older version, see if you can write those tests using Capybara/Integration Tests.
Update:
You can find more details on testing framework here: http://guides.rubyonrails.org/v4.1/testing.html#brief-note-about-minitest
It was Test::Unit and nowadays is Minitest. But the basics are the same so it does not really matter.
Another popular testing framework is RSpec. Which you can use instead of Minitest/TestUnit if you want to. I prefer Minitest but there are pros and cons for both frameworks.
Rails 4.2 came with Unit-tests, Functional/Controller-tests and Integration-tests. The built in thing that resembles Nightwatch the most are Integration-tests: http://guides.rubyonrails.org/v4.1/testing.html#integration-testing
You can also look at libraries such as Capybara (https://github.com/teamcapybara/capybara) which calls itself an Acceptance Test framework. It integrates nicely with TestUnit/Minitest/Rspec.

Capybara vs Page Object

I'm currently using Cucumber and Ruby Page Object for testing my Ruby on Rails website.
I'm trying to understand Capybara and decide if I should add it to the mix, or maybe replace Page Object with it.
I'd appreciate if somebody provides more insights into benefits of using Capybara when compared to Page Object, and does it make sense to use them together?
Thanks
You cannot use Cheezy's page-object gem with Capybara.
The page-object gem only supports Watir-Webdriver and Selenium-WebDriver. It does not support Capybara.
Capybara, Watir and Selenium are for driving browsers while page-object is for modelling your pages. If you switch to Capybara, you would need to pick a different page-object library such as SitePrism. Switching would mean you either need to support two completely separate stacks or re-write your existing tests.

Is it possible to use Cucumber to test an existing Rails Application?

I have just finished reading many different web pages on the subject of Cucumber. It appears to be impossible to use Cucumber to test an existing Ruby on Rails application. I'm just asking in case I missed something. (We are considering using it for future RoR app development.)
While I am asking, what is the current consensus on the best tool to test an existing Ruby on Rails application?
I did a little exploration with WATIR and it seems easy to use, but driving the web browser results in being not scalable. I have read some have moved from WATIR to Celerity....
However, I am in an environment where we are starting from zero previous testing. What is the 'best' choice to quickly write tests for an existing Ruby on Rails application?
In no way is Cucumber unable to test an existing application. Not sure what gave you this idea, but perhaps because it's typically used with test-driven development?
Cucumber is by far the most widely used integration testing software for Rails. I would definitely suggest using Cucumber with Capybara, Guard, Spork, and RSpec for your testing suite. (RSpec for unit testing, Capybara for integration tests, Guard and Spork for running your tests quickly).
If you've never looked at Cucumber before, you might want to take a look at some tutorials first.
To get started on your project, try to make a Cucumber feature for a simple feature. For example, write a test to visit the homepage. Something like:
Feature: View homepage
Given I am on the profile page
When I click "home"
Then I should see the homepage logo
Once you've understood that, move on to more complicated features. Examples might include create a user account, login, view a profile, etc. (I don't know what your application does but I think you get the point.)
Cucumber is able to test an existing application.
You have to set configuration setting for cucumber and generate cucumber folder by rails g cucumber
before run this command you have to include gem: gem 'cucumber'.

Totally confused about rails testing.. which tools are for which jobs?

I'm learning Rails after a long time manually testing my own .NET code,
I'm loving what ive seen but i am SO confused about how it all fits together!
So my questions are
1 - Where would i use:
Rspec
Cucumber
Test Unit
Shoulda
Selenium (not really a ruby thing but more of a web thing ive heard)
I've sort-of been testing my code with some very basic RSpec on my models and using factory girl..
2 - Do i need all of these tools?
For example could i choose cucumber and factory girl and never have to learn rspec or is cucumber a pretty dsl wrapper for rspec and test unit...
3 - Are any of them usable / have a port on .NET as well?
Thanks!
Daniel
My current stack of Testing tools is:
Steak, instead of Cucumber.
Capybara with driver Akephalos, instead of Selenium.
RSpec
Machinist2, instead of factory girl.
https://github.com/cavalle/steak
https://github.com/jnicklas/capybara
http://rspec.info/
https://github.com/notahat/machinist
I learned a lot about testing with the book: The Rspec Book, by the Pragmatic Programmers.
http://pragprog.com/
You have more detailed information in this other question:
Rails: Good Rspec2 example usage? (Also: Cucumber, Pickle, Capybara)
For 1)
I do use Rspec for unit and Functional testing.
I do use Cucumber for integration testing. Cucumber uses Capybara or Selenium. I like Cucumber because it enables me to write tests with the customers. They feel implicated and thus give sometimes more details about their expectations.
Selenium could be used as a stand alone app to test your web app directly in your browser.
Many other tools exist, it's really a matter of choice. As you said, fixtures are not used anymore, Factory Girl is one of the best way to create testing data sets.
For 2)
You don't need all these tools, of course. You could even write your tests with the native Rails helpers.
But they provide convenient helpers you can take benefit from. So get the one you prefer. Some, like Cucumber, have extensions (like Pickle), to provide even more helpers.
For 3)
The strength of Rspec, Cucumber, Selenium (those I know) is they can be used to test any app.
I'm curious to listen to other's point of view concerning Ajax testing.

What are spec/requests good for?

I use RSpec to test my lovely little web app. For integration tests I use Steak. When using Rails generators (yep, I know that this is not the Zen way of doing TDD) there are also some files in spec/requests generated. As stated on link text it is something similiar to integration test (but I couldn't find much more info).
Are those request specs still recommended when using something like Steak and Cucumber?
It all depends on what you need and want. The goal of testing is to prove that your app works once, not twice or more times.
I personally write rspec tests for models and helpers. I use cucumber to test that my views and controllers are working the way I expect them to. With this I can prove that my entire app works as I expect it to, so no, I don't use spec/requests.
Occasionally I do use spec/requests to test APIs, but you can do that with cucumber as well.
Some don't like the BDD-way cucumber works and stick with spec/requests. In the end it's all a matter of taste.

Resources