Comments (10)
This may be too obvious, but something like:
Testing
-
When writing ExUnit assertions, be consistent about the order of the expected and actual values under testing. Prefer placing the expected result on the right, unless the assertion is a pattern match.
# preferred - expected result on the right assert actual_function(1) == true assert actual_function(2) == false # not preferred - inconsistent order assert actual_function(1) == true assert false == actual_function(2) # required - the assertion is a pattern match assert {:ok, expected} = actual_function(3)
from elixir_style_guide.
The great thing about the assert macro is that it doesn't enforce the actual, expected positions and that was actually one of the design decisions behind it because sometimes it's hard to determine which expression is "expected" and which is "actual".
It feels backwards to try to enforce a rule in a style guide that goes against the design decision of the tool.
from elixir_style_guide.
Can you link to any examples of both styles?
Even though the assert
macro doesn't care, obviously, there are a few reasons I would tend to favor assert expected == actual
:
- tradition (other testing libraries that take args and use that order)
- if you use a pattern match instead of a truthy value, the expected pattern is on the left
- assertion errors are often written/understood in the form "expected A but got B"
from elixir_style_guide.
sure.
from elixir_style_guide.
From the looks of it, every test module is internally consistent (they pick one order and stick with it), but there are examples of both styles.
I'd guess the motivation behind putting actual
first is to highlight "this is what is being tested". For example StringTest.
Would love to hear some more opinions.
from elixir_style_guide.
The great thing about the assert macro is that it doesn't enforce the actual, expected positions
Sure, but the style guide is about enforcing things the compiler or runtime don't care about. :)
I tend to think that expected
first has better meaning but actual
first has better style (especially when successive lines test the same function over and over). Therefore, it seems to be a wash. That would recommend against adding a rule for this.
from elixir_style_guide.
lexmag's elixir style guide is about to include this rule
lexmag/elixir-style-guide#11
from elixir_style_guide.
Thanks for the pointer @eksperimental
For context the linked issue recommends that the "expected result goes on the right", in other words: actual == expected
Since this guide doesn't try to be unnecessarily "opinionated", I'm not sure if there's a way forward here.
from elixir_style_guide.
@christopheradams I don't think the style guide needs to be opinionated about it, just point out "be consistent."
As pointed out in the linked issue, one of the problems with the phrasing is that it will always be expected = actual
when performing a pattern match as a test acceptance.
from elixir_style_guide.
Added a new testing section with this actual == expected
guideline. Thanks everyone!
from elixir_style_guide.
Related Issues (20)
- Module naming with singular vs plural parent directory HOT 1
- camelCase vs PascalCase HOT 3
- Add preference for long args/`when` in methods? HOT 3
- Does the formatter make this obsolete? HOT 3
- Missing a section about maps HOT 5
- @module_attribute should be moved higher in Module attribute ordering HOT 1
- Establishing Guidelines for Maximizing Anonymous Function Readability in Reference to Escaped and Expanded Notations HOT 3
- Suggestion on Module Attribute Ordering HOT 1
- Thoughts on public/private function ordering HOT 4
- Deeply nested one-arity function calls? HOT 2
- new issue
- Placement of defguard? HOT 1
- using pipe with only 2 functions HOT 1
- Pipeline with single pipe operator for common cases like Enum.map/reduce/filter HOT 3
- Nested defmodule HOT 5
- Macro calls placement in a module HOT 1
- Naming: Modules HOT 1
- Clarification on multiline defs HOT 3
- cรณmo utilizamos?
- Racionalfor choice
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. ๐๐๐
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google โค๏ธ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from elixir_style_guide.