Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

panicked at 'called Option::unwrap() on a None value' when mocking generic methods #51

Open
asomers opened this issue May 23, 2018 · 1 comment
Labels

Comments

@asomers
Copy link
Contributor

asomers commented May 23, 2018

I can use Simulacrum to mock a method with generic parameters, and to mock a method with a generic return value, but I seemingly can't do both at the same time. Here's the problematic code:

pub trait A {
    fn foo<T: 'static>(&self, t:T);
    fn bar<T: 'static>(&self) -> T;
}

create_mock_struct! {
    struct AMock: {
        expect_foo_i16("foo") i16;
        expect_foo_u32("foo") u32;
        expect_bar_i16("bar") () => i16;
        expect_bar_u32("bar") () => u32;
    }
}

impl A for AMock {
    fn foo<T: 'static>(&self, t: T) {
        was_called!(self, "foo", (t: T))
    }

    fn bar<T: 'static>(&self) -> T {
        was_called!(self, "bar", () -> T)
    }
}

let mut mock: AMock = AMock::new();
mock.expect_foo_i16().called_once().with(-1);
mock.expect_bar_i16().called_once().returning(|_| -5);
mock.then().expect_foo_u32().called_once().with(1);
mock.expect_bar_u32().called_once().returning(|_| 1_000_000);

mock.foo::<i16>(-1);
mock.foo::<u32>(1);
assert_eq!(-5, mock.bar::<i16>());
assert_eq!(1_000_000, mock.bar::<u32>());

And here's the error:

---- t_simulacrum::t::generic_method stdout ----
        thread 't_simulacrum::t::generic_method' panicked at 'called `Option::unwrap()` on a `None` value', libcore/option.rs:335:21
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
stack backtrace:
   0: std::sys::unix::backtrace::tracing::imp::unwind_backtrace
   1: std::sys_common::backtrace::print
   2: std::panicking::default_hook::{{closure}}
   3: std::panicking::default_hook
   4: std::panicking::rust_panic_with_hook
   5: std::panicking::begin_panic_fmt
   6: rust_begin_unwind
   7: core::panicking::panic_fmt
   8: core::panicking::panic
   9: <core::option::Option<T>>::unwrap
             at /checkout/src/libcore/macros.rs:20
  10: <simulacrum_mock::store::ExpectationMatcher<'a, I, O>>::was_called
             at /usr/home/somers/.cargo/registry/src/github.com-1ecc6299db9ec823/simulacrum_mock-0.1.0/src/store.rs:224
  11: simulacrum_mock::mock::Expectations::was_called
             at /usr/home/somers/.cargo/registry/src/github.com-1ecc6299db9ec823/simulacrum_mock-0.1.0/src/mock.rs:51
  12: <<mock_shootout::t_simulacrum::t::Simulacrum as mock_shootout::TestSuite>::generic_method::AMock as <mock_shootout::t_simulacrum::t::Simulacrum as mock_shootout::TestSuite>::generic_method::A>::foo
             at src/t_simulacrum.rs:194
  13: <mock_shootout::t_simulacrum::t::Simulacrum as mock_shootout::TestSuite>::generic_method
             at src/t_simulacrum.rs:209
  14: mock_shootout::t_simulacrum::t::generic_method
             at src/lib.rs:28
  15: mock_shootout::__test::TESTS::{{closure}}
             at src/lib.rs:28
  16: core::ops::function::FnOnce::call_once
             at /checkout/src/libcore/ops/function.rs:223
  17: <F as alloc::boxed::FnBox<A>>::call_box
  18: __rust_maybe_catch_panic
             at libpanic_unwind/lib.rs:105
@jasongrlicky
Copy link
Contributor

Oh, that’s really interesting - thanks for reporting this, I’ll look into it!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants