Works perfectly, thanks!
I will go with the "as_stubbed_const"-approach as it suits my needs best
for now.
J.
Am Donnerstag, 25. Juni 2015 17:27:23 UTC+2 schrieb Myron Marston:
>
> Would I first mock the object using
>
> book_object = double("Book")
> allow(book_object).to receive(:read_page).and_return(...)
>
> That certainly works, but I have two suggestions:
>
> - Use instance_double("Book") instead of double("Book"). The latter is
> not a verifying double, which means it does nothing to warn you when the
> interface of your test double and that of Book instances diverge.
> - Since you don’t appear to care about the arguments, you can in-line
> the stub as part of the test double definition:
>
> book_object = instance_double("Book", read_page: page_value)
>
> and then mock the class by
>
> book = class_double("Book")
> allow(book).to receive(:new).and_return(book_object)
>
> Again, you can inline the new stub:
>
> book = class_double("Book", new: book_object)
>
> Actually, you could inline it all into one line:
>
> book = class_double("Book", new: instance_double("Book", read_page:
> page_value))
>
> That said, neither your snippet nor this one-line will work for the code
> snippet you pasted, because your snippet directly references the Book
> constant.
>
> One solution is to change the code under test to accept an injectable
> book_factory argument (which can have a default value of Book but in your
> test you can pass the class double for it). This makes has all the benefits
> of dependency injection (makes the dependency explicit in the method
> signature, supports additional flexibility by allowing the caller to pass a
> different book implementation, etc) while having all the downsides of
> dependency injection (added code, an additional argument that is just there
> to support testing, YAGNI, etc).
>
> Another approach is to chain as_stubbed_const off your class_double:
>
> class_double("Book", new: instance_double("Book", read_page:
> page_value)).as_stubbed_const
>
> This will cause the Book constant to be defined (or replaced) for the
> duration of the example as your class double, so that any code that
> references the Book constant will get your test double rather than the
> real Book class and/or an “undefined constant” error.
>
> A third approach is to define your Book class and stub the new method on
> that directly…but it sounds like you are wanting to avoid defining it so
> one of the first two approaches better fits the workflow you are aiming
> for, I think.
>
> HTH,
> Myron
>
>
> On Thu, Jun 25, 2015 at 3:21 AM, JSchlinker <[email protected]
> <javascript:>> wrote:
>
>> I am using rspec-mock for test-driven-development.
>>
>> I am starting implementing a single class and mocking/stubbing the other
>> classes using rspec-mock. Mocking only objects of classes yet to be
>> implemented works well. However when I try to mock a class method and
>> instance methods for objects of the same class I am not sure how the
>> preferred way to do this looks like.
>>
>> I have code that e.g. looks like this:
>>
>> new_book = Book.new
>> content = new_book.read_page(5)
>>
>> I now want to mock out everything that has to do with the class "Book".
>> In this example this would mean "Book.new" and "new_book.read_page"
>>
>> Would I first mock the object using
>>
>> book_object = double("Book")
>> allow(book_object).to receive(:read_page).and_return(...)
>>
>> and then mock the class by
>>
>> book = class_double("Book")
>> allow(book).to receive(:new).and_return(book_object)
>>
>>
>> Is this the way to go?
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "rspec" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected] <javascript:>
>> .
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/rspec/0690a743-805e-410a-ba9d-2bc2a2ea930e%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/rspec/0690a743-805e-410a-ba9d-2bc2a2ea930e%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
--
You received this message because you are subscribed to the Google Groups
"rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/rspec/a56a5dca-4b3e-45b3-bd3d-4cf003929863%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.