Merken

Teaching RSpec to Play nice with Rails

Zitierlink des Filmsegments
Embed Code

Automatisierte Medienanalyse

Beta
Erkannte Entitäten
Sprachtranskript
the and hit it I ruined but there are a few of you know what they down the back there and this room is very big you can come forward it's fine I won't buy I promise there we great by this is teaching us back to play nice with rails let's get started I could not
be more excited and more happy to be back here at rails Conf on this stages a lot bigger than 1 I thought I was going to be presenting on and this year but last year and make the conference some of you know the story so you don't but I was suffering from a life
threatening infection in my leg and actually exactly a year ago to this day I took this picture of myself in
hospital and takes it to my mom she had a bit of a freak out but it was fine and this is a bag Woodrow could care for excellent cataracts CERN is a super powerful broad-spectrum antibiotic and were it not for the efforts of the doctors and nurses the NHS in the UK I would not be here today giving this presentation in a very literal sense and I'm hugely thankful to them and the health care system in the UK that means that a year later I'm alive and able to give this talk on the stage but I'm not telling you this story Ted induced sympathy toward me but instead the telling about something slightly odds that happened at the rails come from last year we had this problem where else comes last year was the commons were rails 5 is due to be announced and that meant that there are a bunch of talks in the program about how to get various things working with rails 5 it's a big may diversion stuff will break that is bad and I was going to give the talk about how to get all back working with rails 5 and it doesn't really have back-up speaker that had a talk that looked like that and that was a fairly large gap in the committee and the programs so do myself on the rest of the program committee decided that the correct thing to do would be to
call up just cells whose giving the keynote tomorrow and energy is in the room is from the noise from the writing his keynote i and have him give my sort instead this is funny because the program committee rejected the talk just in the submitted out right we like who not that doesn't seem like a talk we like to have and then you are now just in morally obliged to give the all spectral because sound is dying and he took that with nothing but grace if you see in the talk you know that he spent about half of it basically trolling me but in all seriousness I said this before and this will be the last time I mentioned this on a Central's stage just in I am
hugely thankful that you did not even if you're not in the room right now I and I think everyone should use the meme hashtag hashtags amphibian is just cells confirmed between him and let him know that thankful to fight
. 1 the some of you will probably need all spectra work with rails 5 . 1 and I compatibility is
come in with a couple of caveats we do not have any support for action shot books case nor action dispatch belief system test case please have some faith in us so the in all seriousness else 5 . 1 has not been released yet and that means we can't actually give out compatibility with that but we have a branch ready that should just what and so there will be no changes required by year as soon as all alspac 3 . 6 . 0 was released you just build upgrade and everything will but we don't have integration system test because I haven't had enough spare time to do that yet but I would absolutely welcome a poor request from anyone who would like to integrate rails type 1 system test with Austin so that's all the front matter now get into the actual talk
the integrations between spec and rails it and how we got them before I go too far I think it's really important to discuss sort of the high-level architecture all of the Auspex framework 1 of things I think not a lot of people realize is that all spec isn't a
single monolithic genome this said a series of testing components the designed to work together really well so when he's specified all in your gem file the 1st thing bundler is going to do is is going to go out and fetch the Auspex gender the onstage and actually doesn't do anything on its it doesn't have any coincided of any consequence instead what the Auspex does depend on the rest of the components of all spec the form together to make the testing framework you also used to using day 1 of the dependencies could all spec call on that provides describe and it's and tagging and the runner and all of the tooling that used to actually build and execute your tests all spec expectations provides the expects keyword to all the matches that you use using in the powerful composed systems all specmarks provides the mocking install maintainability is Alspector doubles spies and all that good stuff as in these little direct dependencies of all spectra that independent gems you can pull each part of them on its own without having have any of the others all 3 of these genomes depend on what's called Auspex support which most people don't know about all spec supporters are internal Shad current between all spec gems and we use it for various things like pulling methods of objects determine method signatures interpreter functions and so on and nothing in this jam is marked as part of the public API so you should never call coding spec support directly but is that none the less off the rails is an entirely
different beast it functions kind of on its own packages the rest of the Auspex ecosystem and also provides a bunch of its own code and links directly into the rails version that you'll user in this manner prospect rails is able to provide the entirety of all spectra users were used to and then combine that with rails specific stuff in order to make testing Orelle's up really easy so if you see the gem OS back and
general spec rails antigen file is actually kind of a smell your specifying your dependency on the gem twice and instead you can just pull all spec rails and everything will be fine but for our I think
this is a reasonable statement yeah yeah and that complexity also comes with the fact that all spec is really permissive about which parts of relative using what versions specifically alspac supports all rails versions greater than or equal to the rails 3 point others that means we support 383 . 1 3 . 2 4 4 . 1 4 . 2 5 and soon 5 . 1 this that's a lot of rails versions of it leads to a lot of coded inside the jam the condition we switches on what rails version is being used at least what cucumber examples being tagged with different rails version support it leads to hear docs that contain Ruby cards that switch on rails versions 5 the
the there was a lot of what get
Alspector compatible with rails 5 and in the core of this talk and going through some of the issues that I encountered how I thought about debugging them or when external contributors were involved how I helps them make the issues better all got help from other necessary maintainers to fix everything up this is broken into a series of lessons and the first one is that major
versions meaning people can break things
and so the at the keynote is not lost year but the year before it was announced that controllers
has them to get soft deprecated and what that actually meant is that assigns and assert templates plates were going to be removed assigns is the thing that lets you test the instance variables you control signs a set template is the thing that lets you test which can like is going to get rendered I'm like please you know
stop there are thousands and thousands of control tests in the world that desperately need these things to function you can't do this to us and the I was over reacting with the terms of rails team had a
plan which was this gem called rails controller testing all rails ControllerTesting gem does is provide a signs in a certain way again and so I'm like great this
is perfect all this integrators back into all spec will not tests everything will be fine so
let's add it to make sure it works and
all know the entire test we exploded looking at this a little bit closer we discover that actually it's just
view specs that stopped working and I'm like OK that's less bad because mostly nobody rights abuse facts and wow maybe you do all right use tags and I just terrible but I know but specifically a thing that was broken is part helpless things like you're all for gadgets part use a path etc. you know those things I like aaai let's work out what's going on here so we take 1 of our automatically generated you tests we stick a prior on it we look for the gadgets path and we get undefined local methods the gadgets part we switch back to rails 4 point here we call the say method and it works so we know
somewhere between like rails 4 . 2 and when this jam was extracted like something has work I like very
well what could possibly of change it's pretty likely the gadgets part is not provided directly on the test but instead 1 of the the user gets included the controller so I'm like I controller tell me everything that you made up of an you get a huge list of nonsense back but just explain this the top line there is a singleton class of the object the 2nd line is the class of the object itself then we have action dispatch test results 3 random anonymous modules actually controller based and then a bunch of stuff action control bases where we can approximately stop looking because that's the thing we used to use a His which Federales 5 and it looks materially different and specifically those 3 random anonymous
modules disappeared out this ancestor chain like and was modules are the hardest thing to the board ever to there have a name there have a source location you were how on earth am I supposed to find this so a stick approach more price and that are at my hair out and get mad and eventually it points me at this line of cards and I'm like I look at it it's like new in upper module including that module into another module and then doing some crazy hurts like not not had enough but I mean I know all spec rails like the back of my hand but I am not like an expert at the deep deep in tunnels of the Rails framework I'm willing to admit that so I
have shown right show this is not what's going on here and we solve into a cycle and reality and as many something like 3 or 4 hours trying to buy this ourselves Sean release a lot about the yet yet so for as my life gone and then eventually show like this appears to be a load inclusion order kind of bonds and your rights as like
SA of a commit message this is the 1st part of this talk right really long commit messages that explain what's going on because anything that takes 4 hours of 2 like Ruby maintainers to work out is complicated and non-obvious and scary the diff looks like
this and I won't make you squint but basically it's changing the order that the ah ControllerTesting Janez including stuff in and everything works we went for broken German functional jam and
I think this is a huge win for collaboration relativist change I was like on my own solar maintainers scared and lost and confused unlike Hayward ecosystem I need some help and it helped me and it was great like I love it when we get together and fix that stuff it makes me really mad that I had to debug anonymous modules but I think this is a great when and then we will basically ready to release the jam and we did and users started filing issues 0 my god I saw many but it turns out that like the test suite that you have usually doesn't cover all the cases and your users of doing things you can't possibly imagine so the remainder of the issues that will be looking at today where she is filed by actual spec uses as process stuff I encountered was trying to do the upgrade Western to it
is actually possible for rails to have blogs this may seem like a controversial statement but I have to believe me so we're
talking about off the rails issue 1658 you can look this or that the user was basically like sigh cookies and not available in control aspects and offer growls unlike the hell is assigned cookie and literally
never heard of that rails feature before like alright I'm sure that's supposed to work let's find out so I
applied the label to it triage and this is a pretty common thing to maintain is to have is like a personal state machine for how they move issues when I label issue triage it basically means you filed this and I haven't yet had enough time to work out whether there is enough information to reproduce the issue and I let that life a little while and I come back to it a few days later and I basically come to the conclusion that the original issue you didn't have enough information in it so I ask
this question of the original submitter this basically says thank you for filing this blog I was able to reproduce the information you gave me please give me a rails at that I can call on so I can just run bundle exec all spec and see what your body there's and I apply the label means reproduction case I think this is an incredibly common maneuver for maintain these days because even though you filing issue represent us having a knowledge point that something is wrong it really really hard for us to work out what exactly is broken rails is a complication environment there are many genomes as all of your configuration as everything you do to actually causes blood to appear and frankly I can't necessarily reproduce that given just a few lines of spec issues the and the user comes back immediately with white yes done plan this 1 lexical specter good men like yes go
team we did it this is how often source
is supposed to work and so I find that the issue is rail and I move the issue
from needs reproduction taste has reproduction case and this state machine industry OJ needs has is something I do with nearly off the rails issues because it helps me know why do and do not have to fix but now that I have this green issue I can
actually begin to boarding for problems so we climb the rails up that the user has provided and we also plan a fresh version of rails into its own repository I do this so that I can move the commitments on backwards and forwards i . the rails of the user has provided at my fresh rails for a check that the test the still failing and I get bisect bad a check out 4 point to be so for and there's a very specific reason is this motion this is the last version of rails 4 point you on the master branch after this 4 . 2 was released and then they have a 4 . 2 stable branch which doesn't track master so I constantly bisects between like 4 point 2 and 5 on that branch i have to use so I check out the specific commit I run my tests they pass I get my set goods and get tells me I have 6 thousand 794 of revisions of that in order to determine what's wrong 0 gods the
this is my life now yeah so I basically just run the test suite backwards and forwards it bisect bad good bad good bad good and eventually this commit pops
out commit number 80 to 90 whatever and I leave myself a little note as exactly to what the problem is but not necessarily affects this is definitely 1 where the body exists in rails not in Auspex interaction with it and so I leave it for a
while life happens I get a job where I have to move to New York not think of and then cluster while I'm like at really columns and as having a discussion with somebody has like so I bisected 6 thousand revision the rails found a specific problem and a really sure what to do now and shown turns around and goes you have a breaking commit to show me I'll fix it right now was like all right so I going
to get hold of a military just paying at as with high lo and behold immediately this issue is not the bug in all spanking be reduced with rails a lot shortens of our on rails which provides a rails reproduction script and specifically states this can
be replicated purely with rails using the public API in open source we have a twisty tiny maze of dependencies your rails at that uses all speckles Cappy bar and a different genome and that a coffee script compiler for some reason 2070 as you got rid of that that's an unfair accusation of p it is so our default value issue on a specific jam it's worth noting that the bug could be anywhere in the dependency tree all of that jazz has served it's well worth carrying down and see if you can reproduce it with a subset of the things that are available specifically rails having guide for doing reproduction scripts and before filing bugs on all spec rails I would thoroughly encourage you to check it's not a bug in rails for us wasn't 3 sometimes you
can't just pull up shown to fix the problem the elimination so so this
issue off that rail 1662 can no longer set host exclamation mark in before book for requests that's and that's not immediately obvious so let me show you what this means
basically if you haven't alspac configuration that globally sets offers are in a before all blog this stopped working and there are good reasons to do this before what's a useful arm and this 1st Bank can happen if you have richer configurations the cause you have subdomains your act there also being responded to and I'm like this should work and also I feel like I touch the sky whereas upgrading Alspector worker roles fights over all the aspect that maintain please don't close this issue on again and I ask the summits for reproduction case exactly as I did in the other issues and they come back to me not just with a reproduction taste but with I made
a short screen of how to use this app to the debug I'm like all my
God yes that's the best thing ever had so much better than just close this someone like that also that he want and through he shows me whether but because he shows what you tried changing so as so I pull down the reproduction of I do the same by
section in shade thing are the commit
message that's out and I go have a look and it's part uh and I am basically in the change rails 5 that this got committed to which changed the application initialization logic to happen lazily instead happening before sets of books before Senate block-circulant to you before each in ASR that and so will always happen after that before all user specified and that's all bug sir unlike this 1 is simple enough but I can fix it myself I open a poor quest on rails explaining what changed why broke the thing my proposed fix maintain his love it when
you drop context on the more words you write about your change increases the likelihood of getting accepted because it just makes it easier for us to understand what's going on I also did that part of
not just the PO message but the actual commit as well and the reason for that is that if any rails maintained in the future is ever blame diamond but blame the diving the source of rails to work out what's going on they can without leaving that tunnel look at that commit message and see what changed and why and who did it and they can like come at me on the Internet if I broke everything but I don't think I did so after some discussion
of sort of round trips with arrows in graph of for some of it is shown that also that I got much and then I completely forget about it and don't close the issue on all spectra plural months the system someone just
comes along and his like have you you face the body in rails you should close this session but you're right I totally totally should I'm a terrible fallible human the truth as if I fix something and
you just pay me on Galvan like you fix this do you still need this issue to upon I can be like you know and I can close an issue and you get a simple 1 minute action against women issue on my issue tracker as external contributed that makes me super happy so the the summary
is I all Alspector definitely
has boards but the surface area of all integration with rails is not all that big and if you have a rail specific Bobby in your Auspex leads I have seen it the in both places but it can be the cause of rails and literally every fix I showed
today was an a agenda is owned by the roles for that not by all static I know that if you in this room your way more likely to be a fan of all alspac that fan of many tests but if you can
use the rails reproduction script guide which asks to tested in many tasks just to make sure that's where the bog lights and
rails has a really good guide during the when you open an issue that
has more than the most basic form of complexity and likely to ask you to send me an app where I can reproduce exactly what's going on the reason for that is not that light I value my time more than yours is that 5 minutes of you doing the extra work of packaging it up can save me literally hours of debugging in my framework and that's really important you can always just call Sean to get rails once fixed
my name is I am OK real talking I I think working on open
source is a really hard thing to do so as a sort of career maintain it absorbs your evenings and weekends and sometimes stuff goes out into the world added everyone's test suite is on fire and you are the only person in the world you can fix and I have a friend who once
treated retweet of participating in Open Source has made you cry that has happened to me I a 100 % can tell you that for sure the work
represented in this talk so to more than 40 hours a maintain a time that's a full work week my time all the loss maintainers Sean's rails core team rails committed team neural wonderful people give give maintainers hugs they really deserve it and more importantly in that like I think open source is more approachable than it has ever been and it will continue to do so the previous talk was about how to contribute get started contributing to rails the told before that was a deep dive into a new Rails feature if your company materially depends on the existence of rails all stack bundle of revisions in order to exists it seems natural to me that you should find some time to work on that and with that leg you saw a giant red slide at the beginning of this talk I'm a fan of communism our maybe we should find ways to ensure that maintainers can get paid for their work just a thought so this has cut just 1 random cheer up in the meantime the
please buy me drinks at the ball or if you use or spec like that seems like a fair trade off right by the gray graph of but
I I worked for a company called digital edition we are infrastructure as a service provider that means we do servers Block Storage Networking all the primitive components for you to build an amazing applications but we are hiring I like working there are a lot there's a lot of fun of products a cool all I have swag come find me let's talk about services New but so that's all I've got
thank you very much for listening I'm Sanford in on Twitter Sentiment get hard if you like to e-mail me I'm at don't color thank you I will take any and all questions and yeah it on the anonymous modules still there yes I Due to the best of my recollection it's like an active support concerns that does something with reset listen I'll send you to commit like it's the the computers are extremely bad and 1 thing that could be done that make it easier is to have those models defined self thought name with something sensible in the light the I don't know all the performance implications about all or if it's a whole path or whatever and there there's like a whole section rails maintain set just over here so maybe just like ask them in the head and he will I literally can't see shows below right thank you very much now the 5th
and the UN
Computeranimation
Videospiel
Computeranimation
Fehlertoleranz
Zentralisator
Energiedichte
Bit
Zellularer Automat
Geräusch
Physikalisches System
Optimierung
Kombinatorische Gruppentheorie
Quick-Sort
Brennen <Datenverarbeitung>
Zellularer Automat
Computeranimation
Signifikanztest
Datentyp
Gruppenoperation
Mathematisierung
Annulator
Computerarchitektur
Physikalisches System
Framework <Informatik>
Quick-Sort
Computeranimation
Integral
Versionsverwaltung
Framework <Informatik>
Code
Computeranimation
Bildschirmmaske
Erwartungswert
Code
Speicherabzug
Installation <Informatik>
Zusammenhängender Graph
Signifikanztest
Softwaretest
Umwandlungsenthalpie
Lineares Funktional
Interpretierer
Matching <Graphentheorie>
Reihe
Systemaufruf
Strömungsrichtung
Physikalisches System
Elektronische Publikation
Binder <Informatik>
Elektronische Unterschrift
TLS
Softwarewartung
Objekt <Kategorie>
Mereologie
Ordnung <Mathematik>
Subtraktion
Befehl <Informatik>
Punkt
Konditionszahl
Versionsverwaltung
Elektronische Publikation
Versionsverwaltung
Komplex <Algebra>
Computeranimation
Chipkarte
Softwarewartung
Modallogik
Glättung
Reihe
Speicherabzug
Hilfesystem
Computeranimation
Signifikanztest
Variable
Softwaretest
Menge
Vorzeichen <Mathematik>
Gamecontroller
Template
Gamecontroller
Versionsverwaltung
Computeranimation
Instantiierung
Softwaretest
Signifikanztest
Vorzeichen <Mathematik>
Automatische Handlungsplanung
Gamecontroller
Term
Computeranimation
Signifikanztest
Bit
Punkt
Sichtenkonzept
Rechter Winkel
Mereologie
Sichtenkonzept
Computeranimation
Integral
Signifikanztest
Objekt <Kategorie>
Resultante
Gruppenoperation
Mathematisierung
Mereologie
Klasse <Mathematik>
Gamecontroller
Stützpunkt <Mathematik>
Mailing-Liste
Modul
Gerade
Computeranimation
Videospiel
Expertensystem
Quellcode
Modul
Framework <Informatik>
Whiteboard
Computeranimation
Chipkarte
Verkettung <Informatik>
Last
Softwarewartung
Dreiecksfreier Graph
Windkanal
URL
Inklusion <Mathematik>
Ordnung <Mathematik>
Gerade
Subtraktion
Vererbungshierarchie
Signifikanztest
Computeranimation
Gruppenoperation
Softwarewartung
Lemma <Logik>
Einheit <Mathematik>
Rechter Winkel
Betafunktion
Mereologie
Ordnung <Mathematik>
Message-Passing
Zehn
Normalvektor
Signifikanztest
Suite <Programmpaket>
Kollaboration <Informatik>
Befehl <Informatik>
Prozess <Physik>
Web log
Allgemeine Relativitätstheorie
Mathematisierung
Modul
Computeranimation
Überlagerung <Mathematik>
Softwarewartung
Divergente Reihe
Kollaboration <Informatik>
Grundsätze ordnungsmäßiger Datenverarbeitung
Hilfesystem
Gamecontroller
Cookie <Internet>
Cookie <Internet>
Gamecontroller
Computeranimation
Videospiel
Punkt
Zustandsmaschine
Web log
Güte der Anpassung
Automatische Handlungsplanung
Computeranimation
Programmfehler
Programmfehler
Klon <Mathematik>
Information
Programmierumgebung
Konfigurationsraum
Faserbündel
Gerade
Zustandsmaschine
Quellcode
Computeranimation
Signifikanztest
Suite <Programmpaket>
Videospiel
Weg <Topologie>
Punkt
Dokumentenserver
Betafunktion
Klon <Mathematik>
Grundsätze ordnungsmäßiger Datenverarbeitung
Versionsverwaltung
Verzweigendes Programm
Punkt
Ordnung <Mathematik>
Hinterlegungsverfahren <Kryptologie>
Unendlichkeit
Videospiel
Prozess <Informatik>
Subtraktion
Cookie <Internet>
Versionsverwaltung
Kontrollstruktur
Interaktives Fernsehen
Zahlenbereich
Computeranimation
Umwandlungsenthalpie
Open Source
Compiler
Marketinginformationssystem
Marketinginformationssystem
Computeranimation
Programmfehler
Teilmenge
Netzwerktopologie
Skript <Programm>
Skript <Programm>
Elektronischer Programmführer
Default
Normalvektor
Aggregatzustand
Schnittstelle
Domain <Netzwerk>
Fehlermeldung
Web log
Physikalischer Effekt
Klon <Mathematik>
Konfigurationsraum
Abgeschlossene Menge
Speicherabzug
Stichprobe
Eliminationsverfahren
p-Block
Konfigurationsraum
Computeranimation
App <Programm>
Touchscreen
Grundsätze ordnungsmäßiger Datenverarbeitung
Computeranimation
Touchscreen
Äquivalenzklasse
Vererbungshierarchie
Konfigurationsraum
Mathematisierung
Kartesische Koordinaten
E-Mail
Instantiierung
Mathematische Logik
Variable
Computeranimation
Programmfehler
Menge
Betafunktion
Mereologie
Garbentheorie
Cloud Computing
p-Block
Message-Passing
Likelihood-Funktion
Vererbungshierarchie
Mathematisierung
Quellcode
Kontextbezogenes System
Kontextbezogenes System
Computeranimation
Internetworking
TUNIS <Programm>
Rhombus <Mathematik>
Wort <Informatik>
p-Block
Message-Passing
Graph
Zeitrichtung
Unrundheit
Physikalisches System
Quick-Sort
Computeranimation
Softwarewartung
Gruppenoperation
Computeranimation
Signifikanztest
Umwandlungsenthalpie
Flächeninhalt
Fächer <Mathematik>
Physikalischer Effekt
Flächentheorie
Whiteboard
Computeranimation
Integral
Task
App <Programm>
Bildschirmmaske
Stichprobe
Skript <Programm>
Skript <Programm>
Elektronischer Programmführer
Komplex <Algebra>
Framework <Informatik>
Computeranimation
Signifikanztest
Open Source
Suite <Programmpaket>
Quellcode
Quick-Sort
Computeranimation
Einfügungsdämpfung
Open Source
Versionsverwaltung
Computeranimation
Softwarewartung
Rechenschieber
Open Source
Twitter <Softwareplattform>
Fächer <Mathematik>
Softwarewartung
Existenzsatz
Speicherabzug
Ordnung <Mathematik>
Faserbündel
Neue Medien
Dienst <Informatik>
Speicherbereichsnetzwerk
Server
Zusammenhängender Graph
Kartesische Koordinaten
p-Block
Biprodukt
Service provider
Algorithmische Zahlentheorie
Informationsmodellierung
Twitter <Softwareplattform>
Garbentheorie
Kantenfärbung
Modul
Schreib-Lese-Kopf

Metadaten

Formale Metadaten

Titel Teaching RSpec to Play nice with Rails
Serientitel RailsConf 2017
Teil 07
Anzahl der Teile 86
Autor Phippen, Sam
Lizenz CC-Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported:
Sie dürfen das Werk bzw. den Inhalt zu jedem legalen und nicht-kommerziellen Zweck nutzen, verändern und in unveränderter oder veränderter Form vervielfältigen, verbreiten und öffentlich zugänglich machen, sofern Sie den Namen des Autors/Rechteinhabers in der von ihm festgelegten Weise nennen und das Werk bzw. diesen Inhalt auch in veränderter Form nur unter den Bedingungen dieser Lizenz weitergeben.
DOI 10.5446/31288
Herausgeber Confreaks, LLC
Erscheinungsjahr 2017
Sprache Englisch

Inhaltliche Metadaten

Fachgebiet Informatik
Abstract RSpec gives you many ways to test your Rails app. Controller, view, model, and so on. Often, it's not clear which to use. In this talk, you'll get some practical advice to improve your testing by understanding how RSpec integrates with Rails. To do this we'll look through some real world RSpec bugs, and with each one, clarify our understanding of the boundaries between RSpec and Rails. If you're looking to level up your testing, understand RSpec's internals a little better, or improve your Rails knowledge, this talk will have something for you. Some knowledge of RSpec's test types will be assumed.

Ähnliche Filme

Loading...