I'm a beginner both with Rhino mocks and mocking in general.  My unit under 
test does numerical computation and its results are inexact.  Therefore my 
expectations have to be of the form 'parameter is within a range'.  In 
trying to achieve this, I've discovered some issues with Rhino that I don't 
know how to resolve.

Here's a simple test, which passes.

        [Test]
        public void Simple()
        {
            // Arrange
            ICall call = MockRepository.GenerateStrictMock<ICall>();
            for (int x = 0; x < 1000; x += 100)
            {
                call.Expect(c => c.Call(x));
            }

            // Act
            for (int x = 900; x >= 0; x -= 100)
            {
                call.Call(x);
            }

            // Assert
            call.VerifyAllExpectations();
        }

If I change the expectation to use the Arg approach, then this also passes:

                call.Expect(c => c.Call(Arg<int>.Is.Equal(x)));

If I use the Matches approach to define a custom constraint, however, the 
test fails:

                call.Expect(c => c.Call(Arg<int>.Matches(p => p == x)));

AnalysisUnitTests.TrackFinderTests.Arg_Matches_x:
Rhino.Mocks.Exceptions.ExpectationViolationException : ICall.Call(900); 
Expected #0, Actual #1.
ICall.Call(p => (p = 
value(AnalysisUnitTests.TrackFinderTests+<>c__DisplayClass24).x)); Expected 
#1, Actual #0.

I presume that this is because the predicate (including x) is evaluated as 
the matching takes place - in which case x is either undefined or fixed in 
all instances of the predicate.

The reason I was trying to use .Matches is of course that I wanted to write 
something like 

    .Arg<int>.Matches(p => p > x - tolerance && p < x + tolerance)

Is there another way to achieve this?  Clearly I can do part of the range 
checking:

    .Arg<int>.Is.GreaterThan(x - tolerance)

So is there a way to 'chain' the constraints?  Something like 

    .Arg<int>.Is.GreaterThan(x - tolerance).AndIs.LessThan(x + tolerance)

Any help gratefully received!

-- 
You received this message because you are subscribed to the Google Groups 
"Rhino.Mocks" 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].
Visit this group at http://groups.google.com/group/rhinomocks.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to