class Mocks::NullObject(T)

Overview

Double that responds to all methods, typically used for method chains. Calling a method that exists on the underlying double will delegate to that method. Conversely, calling a method that doesn't exist will return the same instance.

double(TestDouble, some_method: 42)
TestDouble.new.some_method # => 42
null_object = NullObject.new(TestDouble.new)
null_object.some_method  # => 42
null_object.other_method # => null_object

Included Modules

Defined in:

mocks/null_object.cr

Constructors

Macro Summary

Instance Method Summary

Class methods inherited from module Mocks::Stubbable

unexpected_method_call(method_name : Symbol, abstract_call : Bool, type : NoReturn.class) : NoReturn
unexpected_method_call(method_name : Symbol, abstract_call : Bool, type : T.class) : T forall T
unexpected_method_call

Macros inherited from module Mocks::Stubbable

stub(method) stub

Constructor Detail

def self.new(object : T) #

[View source]
def self.unsafe_construct(address : Pointer, *args, **opts) : self #

[View source]

Macro Detail

macro method_missing(call) #

[View source]

Instance Method Detail

def !=(other) #
Description copied from class Object

Returns true if this object is not equal to other.

By default this method is implemented as !(self == other) so there's no need to override this unless there's a more efficient way to do it.


[View source]
def !~(other) #
Description copied from class Object

Shortcut to !(self =~ other).


[View source]
def ==(other : self) #

Stub implementation.

FIXME Reuse method signature generation code.


[View source]
def ==(other) #
Description copied from class Reference

Returns false (other can only be a Value here).


[View source]
def ===(other : self) #

Stub implementation.

FIXME Reuse method signature generation code.


[View source]
def ===(other) #
Description copied from class Object

Case equality.

The #=== method is used in a case ... when ... end expression.

For example, this code:

case value
when x
  # something when x
when y
  # something when y
end

Is equivalent to this code:

if x === value
  # something when x
elsif y === value
  # something when y
end

Object simply implements #=== by invoking #==, but subclasses (notably Regex) can override it to provide meaningful case-equality semantics.


[View source]
def =~(other) #
Description copied from class Object

Pattern match.

Overridden by descendants (notably Regex and String) to provide meaningful pattern-match semantics.


[View source]
def __mocks(*args, **options) #

[View source]
def __mocks(*args, **options, &) #

[View source]
def dup #
Description copied from class Reference

Returns a shallow copy of this object.

This allocates a new object and copies the contents of self into it.


[View source]
def hash(hasher) #
Description copied from class Reference

See Object#hash(hasher)


[View source]
def hash #
Description copied from class Object

Generates an UInt64 hash value for this object.

This method must have the property that a == b implies a.hash == b.hash.

The hash value is used along with #== by the Hash class to determine if two objects reference the same hash key.

Subclasses must not override this method. Instead, they must define #hash(hasher), though usually the macro def_hash can be used to generate this method.


[View source]
def in?(collection : Object) : Bool #
Description copied from class Object

Returns true if self is included in the collection argument.

10.in?(0..100)     # => true
10.in?({0, 1, 10}) # => true
10.in?(0, 1, 10)   # => true
10.in?(:foo, :bar) # => false

[View source]
def in?(*values : Object) : Bool #
Description copied from class Object

Returns true if self is included in the collection argument.

10.in?(0..100)     # => true
10.in?({0, 1, 10}) # => true
10.in?(0, 1, 10)   # => true
10.in?(:foo, :bar) # => false

[View source]
def inspect(io : IO) : Nil #

Constructs a string representation of the double.


[View source]
def inspect : String #
Description copied from class Object

Returns an unambiguous and information-rich string representation of this object, typically intended for developers.

This method should usually not be overridden. It delegates to #inspect(IO) which can be overridden for custom implementations.

Also see #to_s.


[View source]
def itself #
Description copied from class Object

Returns self.

str = "hello"
str.itself.object_id == str.object_id # => true

[View source]
def not_nil!(message) #
Description copied from class Object

Returns self.

Nil overrides this method and raises NilAssertionError, see Nil#not_nil!.

This method can be used to remove Nil from a union type. However, it should be avoided if possible and is often considered a code smell. Usually, you can write code in a way that the compiler can safely exclude Nil types, for example using if var. #not_nil! is only meant as a last resort when there's no other way to explain this to the compiler. Either way, consider instead raising a concrete exception with a descriptive message.

message has no effect. It is only used by Nil#not_nil!(message = nil).


[View source]
def not_nil! #
Description copied from class Object

Returns self.

Nil overrides this method and raises NilAssertionError, see Nil#not_nil!.

This method can be used to remove Nil from a union type. However, it should be avoided if possible and is often considered a code smell. Usually, you can write code in a way that the compiler can safely exclude Nil types, for example using if var. #not_nil! is only meant as a last resort when there's no other way to explain this to the compiler. Either way, consider instead raising a concrete exception with a descriptive message.


[View source]
def pretty_inspect(width = 79, newline = "\n", indent = 0) : String #
Description copied from class Object

Returns a pretty printed version of self.


[View source]
def pretty_print(pp : PrettyPrint) : Nil #
Description copied from class Object

Pretty prints self into the given printer.

By default appends a text that is the result of invoking #inspect on self. Subclasses should override for custom pretty printing.


[View source]
def pretty_print(pp) : Nil #

[View source]
def same?(other : Reference) #

Stub implementation.

FIXME Reuse method signature generation code.


[View source]
def same?(other : Nil) #
Description copied from class Reference

Returns false: a reference is never nil.


[View source]
def tap(&) #
Description copied from class Object

Yields self to the block, and then returns self.

The primary purpose of this method is to "tap into" a method chain, in order to perform operations on intermediate results within the chain.

(1..10).tap { |x| puts "original: #{x.inspect}" }
  .to_a.tap { |x| puts "array: #{x.inspect}" }
  .select { |x| x % 2 == 0 }.tap { |x| puts "evens: #{x.inspect}" }
  .map { |x| x*x }.tap { |x| puts "squares: #{x.inspect}" }

[View source]
def to_s(io : IO) : Nil #
Description copied from class Reference

Appends a short String representation of this object which includes its class name and its object address.

class Person
  def initialize(@name : String, @age : Int32)
  end
end

Person.new("John", 32).to_s # => #<Person:0x10a199f20>

[View source]
def to_s : String #
Description copied from class Object

Returns a nicely readable and concise string representation of this object, typically intended for users.

This method should usually not be overridden. It delegates to #to_s(IO) which can be overridden for custom implementations.

Also see #inspect.


[View source]
def try(&) #
Description copied from class Object

Yields self. Nil overrides this method and doesn't yield.

This method is useful for dealing with nilable types, to safely perform operations only when the value is not nil.

# First program argument in downcase, or nil
ARGV[0]?.try &.downcase

[View source]
def unsafe_as(type : T.class) forall T #
Description copied from class Object

Unsafely reinterprets the bytes of an object as being of another type.

This method is useful to treat a type that is represented as a chunk of bytes as another type where those bytes convey useful information. As an example, you can check the individual bytes of an Int32:

0x01020304.unsafe_as(StaticArray(UInt8, 4)) # => StaticArray[4, 3, 2, 1]

Or treat the bytes of a Float64 as an Int64:

1.234_f64.unsafe_as(Int64) # => 4608236261112822104

This method is unsafe because it behaves unpredictably when the given type doesn't have the same bytesize as the receiver, or when the given type representation doesn't semantically match the underlying bytes.

Also note that because #unsafe_as is a regular method, unlike the pseudo-method as, you can't specify some types in the type grammar using a short notation, so specifying a static array must always be done as StaticArray(T, N), a tuple as Tuple(...) and so on, never as UInt8[4] or {Int32, Int32}.


[View source]