Comments (6)
I'm running into the same issue. I think, it's a common case for a supporting library to throw exceptions and for us to handle the exceptions accordingly. And I sure would love the ability to test for that path too.
Referring to the documentation of Meck, there seems to be a provision for "expecting" exceptions.
Exceptions can be anticipated by Meck (resulting in validation still passing). This is intended to be used to test code that can and should handle certain exceptions indeed does take care of them:
5> meck:expect(dog, meow, fun() -> meck:exception(error, not_a_cat) end).
ok
6> catch dog:meow().
{'EXIT',{not_a_cat,[{meck,exception,2},
{meck,exec,4},
{dog,meow,[]},
{erl_eval,do_apply,5},
{erl_eval,expr,5},
{shell,exprs,6},
{shell,eval_exprs,6},
{shell,eval_loop,3}]}}
7> meck:validate(dog).
true
Is this something that we can support in Mock? I'm new to Elixir (and totally unfamiliar with Erlang), and haven't read up on macros. Otherwise, would love to contribute back.
from mock.
Btw, I stopped using mock in favor of dependency injection.
from mock.
That's good to know @emilsoman. Is there a different library you are using to achieve it? Or can you point me at a place where I can understand how to do this in elixir?
Thanks,
Kalyan
from mock.
Here's a quick demo of how I changed my code for DI :
#Change this ->
defmodule MyModule do
def get_project(url, dir) do
Git.clone(url, dir)
end
end
# to this ->
# See how we use a default argument.
# This means the consumers of this function don't
# have to know this change and everything works!
defmodule MyModule do
def get_project(url, dir, scm \\ Git) do
scm.clone(url, dir)
end
end
Now you can test it like this:
test "get_project clones a repo using scm" do
defmodule FakeGit do
def clone(url, dir) do
send self, {url, dir}
end
end
MyModule.get_project("fake_url", "fake_dir", FakeGit)
receive do
{url, dir} ->
assert url == "fake_url"
assert dir == "fake_dir"
end
end
There are other ways to do this. Check this blog post. But I find DI using function arguments the best way to do this, YMMV.
from mock.
Thanks Emil for those pointers. Very helpful!
from mock.
Going to close out this issue.
Simply for the record, I did want to point out that erlang code can be executed from within elixir. For example: meck:expect(..)
can be written as `:meck.expect(...).
from mock.
Related Issues (20)
- defdelegate problem HOT 1
- Feature Request: Capture arguments
- assert_called with pattern matching HOT 10
- Assert called doesn't work on second function call
- Tests sometimes fail with `** (MatchError) no match of right hand side value: false` HOT 4
- Proposal: clearer calls assertions with pattern matching HOT 2
- Enable passing the caller module attributes to with_mocks macro HOT 1
- Proposal: add `assert_not_called` macro HOT 2
- Return different values depending on number of times a function is called HOT 5
- Cannot mock Logger.error/1 HOT 1
- Mocking the same function in 2 separate tests while async: false makes test fail.
- Feature Request: Support per-process mocking HOT 3
- Publish README with Documentation
- Feature request: support for `on_exit` style teardown with `setup_with_mocks`
- Typo in the Mock module. Location: `call_history` doc
- Problem with mock function HOT 1
- No Release to hex.pm since May, 2021 HOT 1
- Problems with Elixir 1.14.5 HOT 1
- Assert called does not assert equality when an argument is a map
- Mock is crashing process in umbella project HOT 1
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 mock.