Mock Properties
Mocking properties is similar to mocking methods, but there are a few cases that need special attention like mocking indexers and particular set operations.
To illustrate the usage of the functionality, we will be using the following interface definition:
Sample setup
Property Getter
The property get can be mocked like any other method call. You can arrange a return statement for a specific call (using Returns), throw an exception (using Throws), raise an event when invoked (using Raise), etc.
Let's consider the following example:
Example 1: Arrange the return value of a getter
Here we test that a call to foo.Value
property returns the value we arranged.
Property Setter
The set operation can be mocked for both indexers and normal properties. Set operations are mocked using a special set entry point which is Mock.ArrangeSet(lambda)
.
Property set mocking is useful when you want to make sure or to verify that a particular property is set with an expected value. For this reason, we use a strict mocking.
Example 2: Mock setter when mocking behavior is Strict
With the Arg.Matches<int>
matcher, we set a requirement that the foo.Value
property should have values larger than 3. When we set the value to a number less than 3, a MockException
is thrown.
For more details on how to work with arguments and matchers, check the Matchers help topic.
For asserting a property set in case of loose mocking, the following syntax is available:
Mock.AssertSet(lambda)
.
Accordingly, we can do:
Example 3: Mock setter when mocking behavior is Loose
Here we make sure foo.Value
was actually set to 1
.
Refer to Do Instead for an example that shows how to use
DoInstead
on property set.
Indexers
Indexers are special kind of properties that enable objects to be indexed in a similar manner to arrays.
Consider an interface with an indexer property.
Sample setup
Example 4 shows how you can control the return value of an indexer property getter.
Example 4: Return different values for different indexes
Assert Indexer Set
Make sure that a specific index is set to a particular value.
Example 5: Arrange indexer setter
The code above throws an exception once the zero-indexed item of foo
is set to a value different than the expected one - i.e. foo
.
Assert Indexer Set with Matching Criteria
Make sure that a specific index is set to a value matching a particular criteria.
Example 6: Arrange indexer setter using matchers
The first two set calls satisfy the requirements. However, the third call - foo[0] = "bar"
throws an exception, because we arranged that the zero-indexed item can be set only to "foo"
.