Finished service test with a mock.
This commit is contained in:
parent
3ae573c174
commit
5923b37223
@ -2,6 +2,8 @@
|
||||
using Google.ProtocolBuffers.Descriptors;
|
||||
using Google.ProtocolBuffers.TestProtos;
|
||||
using NUnit.Framework;
|
||||
using Rhino.Mocks;
|
||||
using Rhino.Mocks.Constraints;
|
||||
|
||||
namespace Google.ProtocolBuffers {
|
||||
|
||||
@ -12,33 +14,150 @@ namespace Google.ProtocolBuffers {
|
||||
[TestFixture]
|
||||
public class ServiceTest {
|
||||
|
||||
delegate void Action<T1, T2>(T1 t1, T2 t2);
|
||||
|
||||
private static readonly MethodDescriptor FooDescriptor = TestService.Descriptor.Methods[0];
|
||||
private static readonly MethodDescriptor BarDescriptor = TestService.Descriptor.Methods[1];
|
||||
|
||||
[Test]
|
||||
public void GetRequestPrototype() {
|
||||
TestService mockService = new TestServiceImpl();
|
||||
TestService service = new TestServiceImpl();
|
||||
|
||||
Assert.AreSame(mockService.GetRequestPrototype(FooDescriptor), FooRequest.DefaultInstance);
|
||||
Assert.AreSame(mockService.GetRequestPrototype(BarDescriptor), BarRequest.DefaultInstance);
|
||||
Assert.AreSame(service.GetRequestPrototype(FooDescriptor), FooRequest.DefaultInstance);
|
||||
Assert.AreSame(service.GetRequestPrototype(BarDescriptor), BarRequest.DefaultInstance);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetResponsePrototype() {
|
||||
TestService mockService = new TestServiceImpl();
|
||||
TestService service = new TestServiceImpl();
|
||||
|
||||
Assert.AreSame(mockService.GetResponsePrototype(FooDescriptor), FooResponse.DefaultInstance);
|
||||
Assert.AreSame(mockService.GetResponsePrototype(BarDescriptor), BarResponse.DefaultInstance);
|
||||
Assert.AreSame(service.GetResponsePrototype(FooDescriptor), FooResponse.DefaultInstance);
|
||||
Assert.AreSame(service.GetResponsePrototype(BarDescriptor), BarResponse.DefaultInstance);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CallMethodFoo() {
|
||||
MockRepository mocks = new MockRepository();
|
||||
FooRequest fooRequest = FooRequest.CreateBuilder().Build();
|
||||
FooResponse fooResponse = FooResponse.CreateBuilder().Build();
|
||||
IRpcController controller = mocks.StrictMock<IRpcController>();
|
||||
|
||||
bool fooCalled = false;
|
||||
|
||||
TestService service = new TestServiceImpl((request, responseAction) => {
|
||||
Assert.AreSame(fooRequest, request);
|
||||
fooCalled = true;
|
||||
responseAction(fooResponse);
|
||||
}, null, controller);
|
||||
|
||||
bool doneHandlerCalled = false;
|
||||
Action<IMessage> doneHandler = (response => {
|
||||
Assert.AreSame(fooResponse, response);
|
||||
doneHandlerCalled = true;
|
||||
});
|
||||
|
||||
using (mocks.Record()) {
|
||||
// No mock interactions to record
|
||||
}
|
||||
|
||||
service.CallMethod(FooDescriptor, controller, fooRequest, doneHandler);
|
||||
|
||||
Assert.IsTrue(doneHandlerCalled);
|
||||
Assert.IsTrue(fooCalled);
|
||||
mocks.VerifyAll();
|
||||
}
|
||||
|
||||
delegate void CallFooDelegate(MethodDescriptor descriptor, IRpcController controller,
|
||||
IMessage request, IMessage response, Action<IMessage> doneHandler);
|
||||
|
||||
/// <summary>
|
||||
/// Tests the generated stub handling of Foo. By this stage we're reasonably confident
|
||||
/// that the choice between Foo and Bar is arbitrary, hence the lack of a corresponding Bar
|
||||
/// test.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void GeneratedStubFooCall() {
|
||||
FooRequest fooRequest = FooRequest.CreateBuilder().Build();
|
||||
MockRepository mocks = new MockRepository();
|
||||
IRpcChannel mockChannel = mocks.StrictMock<IRpcChannel>();
|
||||
IRpcController mockController = mocks.StrictMock<IRpcController>();
|
||||
TestService service = TestService.CreateStub(mockChannel);
|
||||
Action<FooResponse> doneHandler = mocks.StrictMock<Action<FooResponse>>();
|
||||
|
||||
using (mocks.Record()) {
|
||||
|
||||
// Nasty way of mocking out "the channel calls the done handler".
|
||||
Expect.Call(() => mockChannel.CallMethod(null, null, null, null, null))
|
||||
.IgnoreArguments()
|
||||
.Constraints(Is.Same(FooDescriptor), Is.Same(mockController), Is.Same(fooRequest),
|
||||
Is.Same(FooResponse.DefaultInstance), Is.Anything())
|
||||
.Do((CallFooDelegate) ((p1, p2, p3, response, done) => done(response)));
|
||||
doneHandler.Invoke(FooResponse.DefaultInstance);
|
||||
}
|
||||
|
||||
service.Foo(mockController, fooRequest, doneHandler);
|
||||
|
||||
mocks.VerifyAll();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CallMethodBar() {
|
||||
MockRepository mocks = new MockRepository();
|
||||
BarRequest barRequest = BarRequest.CreateBuilder().Build();
|
||||
BarResponse barResponse = BarResponse.CreateBuilder().Build();
|
||||
IRpcController controller = mocks.StrictMock<IRpcController>();
|
||||
|
||||
bool barCalled = false;
|
||||
|
||||
TestService service = new TestServiceImpl(null, (request, responseAction) => {
|
||||
Assert.AreSame(barRequest, request);
|
||||
barCalled = true;
|
||||
responseAction(barResponse);
|
||||
}, controller);
|
||||
|
||||
bool doneHandlerCalled = false;
|
||||
Action<IMessage> doneHandler = (response => {
|
||||
Assert.AreSame(barResponse, response);
|
||||
doneHandlerCalled = true;
|
||||
});
|
||||
|
||||
using (mocks.Record()) {
|
||||
// No mock interactions to record
|
||||
}
|
||||
|
||||
service.CallMethod(BarDescriptor, controller, barRequest, doneHandler);
|
||||
|
||||
Assert.IsTrue(doneHandlerCalled);
|
||||
Assert.IsTrue(barCalled);
|
||||
mocks.VerifyAll();
|
||||
}
|
||||
|
||||
|
||||
class TestServiceImpl : TestService {
|
||||
private readonly Action<FooRequest, Action<FooResponse>> fooHandler;
|
||||
private readonly Action<BarRequest, Action<BarResponse>> barHandler;
|
||||
private readonly IRpcController expectedController;
|
||||
|
||||
internal TestServiceImpl() {
|
||||
}
|
||||
|
||||
internal TestServiceImpl(Action<FooRequest, Action<FooResponse>> fooHandler,
|
||||
Action<BarRequest, Action<BarResponse>> barHandler,
|
||||
IRpcController expectedController) {
|
||||
this.fooHandler = fooHandler;
|
||||
this.barHandler = barHandler;
|
||||
this.expectedController = expectedController;
|
||||
}
|
||||
|
||||
public override void Foo(IRpcController controller, FooRequest request, Action<FooResponse> done) {
|
||||
throw new System.NotImplementedException();
|
||||
Assert.AreSame(expectedController, controller);
|
||||
fooHandler(request, done);
|
||||
}
|
||||
|
||||
public override void Bar(IRpcController controller, BarRequest request, Action<BarResponse> done) {
|
||||
throw new System.NotImplementedException();
|
||||
Assert.AreSame(expectedController, controller);
|
||||
barHandler(request, done);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Binary file not shown.
@ -290,31 +290,6 @@
|
||||
</summary>
|
||||
<value></value>
|
||||
</member>
|
||||
<member name="T:Rhino.Mocks.Constraints.LambdaConstraint">
|
||||
<summary>
|
||||
A constraint based on lambda expression, we are using Expression{T}
|
||||
because we want to be able to get good error reporting on that.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.Constraints.LambdaConstraint.#ctor(System.Linq.Expressions.Expression)">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:Rhino.Mocks.Constraints.LambdaConstraint"/> class.
|
||||
</summary>
|
||||
<param name="expr">The expr.</param>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.Constraints.LambdaConstraint.Eval(System.Object)">
|
||||
<summary>
|
||||
determains if the object pass the constraints
|
||||
</summary>
|
||||
<param name="obj"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:Rhino.Mocks.Constraints.LambdaConstraint.Message">
|
||||
<summary>
|
||||
Gets the message for this constraint
|
||||
</summary>
|
||||
<value></value>
|
||||
</member>
|
||||
<member name="T:Rhino.Mocks.Constraints.CollectionEqual">
|
||||
<summary>
|
||||
Constrain that the list contains the same items as the parameter list
|
||||
@ -3819,7 +3794,7 @@
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.Arg`1.Matches(System.Linq.Expressions.Expression{System.Predicate{`0}})">
|
||||
<member name="M:Rhino.Mocks.Arg`1.Matches``1(System.Predicate{``0})">
|
||||
<summary>
|
||||
Register the predicate as a constraint for the current call.
|
||||
</summary>
|
||||
@ -4781,194 +4756,6 @@
|
||||
Logs all method calls for methods
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Rhino.Mocks.RhinoMocksExtensions">
|
||||
<summary>
|
||||
A set of extension methods that adds Arrange Act Assert mode to Rhino Mocks
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.Expect``1(``0,System.Action{``0})">
|
||||
<summary>
|
||||
Create an expectation on this mock for this action to occur
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
<param name="mock">The mock.</param>
|
||||
<param name="action">The action.</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.BackToRecord``1(``0)">
|
||||
<summary>
|
||||
Reset all expectations on this mock object
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
<param name="mock">The mock.</param>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.BackToRecord``1(``0,Rhino.Mocks.BackToRecordOptions)">
|
||||
<summary>
|
||||
Reset the selected expectation on this mock object
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
<param name="mock">The mock.</param>
|
||||
<param name="options">The options to reset the expectations on this mock.</param>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.Replay``1(``0)">
|
||||
<summary>
|
||||
Cause the mock state to change to replay, any further call is compared to the
|
||||
ones that were called in the record state.
|
||||
</summary>
|
||||
<param name="mock">the mocked object to move to replay state</param>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.GetMockRepository``1(``0)">
|
||||
<summary>
|
||||
Gets the mock repository for this specificied mock object
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
<param name="mock">The mock.</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.Expect``2(``0,System.Func{``0,``1})">
|
||||
<summary>
|
||||
Create an expectation on this mock for this action to occur
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
<typeparam name="R"></typeparam>
|
||||
<param name="mock">The mock.</param>
|
||||
<param name="action">The action.</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.Stub``1(``0,System.Action{``0})">
|
||||
<summary>
|
||||
Tell the mock object to perform a certain action when a matching
|
||||
method is called.
|
||||
Does not create an expectation for this method.
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
<param name="mock">The mock.</param>
|
||||
<param name="action">The action.</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.Stub``2(``0,System.Func{``0,``1})">
|
||||
<summary>
|
||||
Tell the mock object to perform a certain action when a matching
|
||||
method is called.
|
||||
Does not create an expectation for this method.
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
<typeparam name="R"></typeparam>
|
||||
<param name="mock">The mock.</param>
|
||||
<param name="action">The action.</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.GetArgumentsForCallsMadeOn``1(``0,System.Action{``0})">
|
||||
<summary>
|
||||
Gets the arguments for calls made on this mock object and the method that was called
|
||||
in the action.
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
<param name="mock">The mock.</param>
|
||||
<param name="action">The action.</param>
|
||||
<returns></returns>
|
||||
<example>
|
||||
Here we will get all the arguments for all the calls made to DoSomething(int)
|
||||
<code>
|
||||
var argsForCalls = foo54.GetArgumentsForCallsMadeOn(x => x.DoSomething(0))
|
||||
</code>
|
||||
</example>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.GetArgumentsForCallsMadeOn``1(``0,System.Action{``0},System.Action{Rhino.Mocks.Interfaces.IMethodOptions{System.Object}})">
|
||||
<summary>
|
||||
Gets the arguments for calls made on this mock object and the method that was called
|
||||
in the action and matches the given constraints
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
<param name="mock">The mock.</param>
|
||||
<param name="action">The action.</param>
|
||||
<param name="setupConstraints">The setup constraints.</param>
|
||||
<returns></returns>
|
||||
<example>
|
||||
Here we will get all the arguments for all the calls made to DoSomething(int)
|
||||
<code>
|
||||
var argsForCalls = foo54.GetArgumentsForCallsMadeOn(x => x.DoSomething(0))
|
||||
</code>
|
||||
</example>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasCalled``1(``0,System.Action{``0})">
|
||||
<summary>
|
||||
Asserts that a particular method was called on this mock object
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
<param name="mock">The mock.</param>
|
||||
<param name="action">The action.</param>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasCalled``1(``0,System.Action{``0},System.Action{Rhino.Mocks.Interfaces.IMethodOptions{System.Object}})">
|
||||
<summary>
|
||||
Asserts that a particular method was called on this mock object that match
|
||||
a particular constraint set.
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
<param name="mock">The mock.</param>
|
||||
<param name="action">The action.</param>
|
||||
<param name="setupConstraints">The setup constraints.</param>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasNotCalled``1(``0,System.Action{``0})">
|
||||
<summary>
|
||||
Asserts that a particular method was NOT called on this mock object
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
<param name="mock">The mock.</param>
|
||||
<param name="action">The action.</param>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasNotCalled``1(``0,System.Action{``0},System.Action{Rhino.Mocks.Interfaces.IMethodOptions{System.Object}})">
|
||||
<summary>
|
||||
Asserts that a particular method was NOT called on this mock object that match
|
||||
a particular constraint set.
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
<param name="mock">The mock.</param>
|
||||
<param name="action">The action.</param>
|
||||
<param name="setupConstraints">The setup constraints.</param>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.VerifyAllExpectations(System.Object)">
|
||||
<summary>
|
||||
Verifies all expectations on this mock object
|
||||
</summary>
|
||||
<param name="mockObject">The mock object.</param>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.GetEventRaiser``1(``0,System.Action{``0})">
|
||||
<summary>
|
||||
Gets the event raiser for the event that was called in the action passed
|
||||
</summary>
|
||||
<typeparam name="TEventSource">The type of the event source.</typeparam>
|
||||
<param name="mockObject">The mock object.</param>
|
||||
<param name="eventSubscription">The event subscription.</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.Raise``1(``0,System.Action{``0},System.Object,System.EventArgs)">
|
||||
<summary>
|
||||
Raise the specified event using the passed arguments.
|
||||
The even is extracted from the passed labmda
|
||||
</summary>
|
||||
<typeparam name="TEventSource">The type of the event source.</typeparam>
|
||||
<param name="mockObject">The mock object.</param>
|
||||
<param name="eventSubscription">The event subscription.</param>
|
||||
<param name="sender">The sender.</param>
|
||||
<param name="args">The <see cref="T:System.EventArgs"/> instance containing the event data.</param>
|
||||
</member>
|
||||
<member name="M:Rhino.Mocks.RhinoMocksExtensions.Raise``1(``0,System.Action{``0},System.Object[])">
|
||||
<summary>
|
||||
Raise the specified event using the passed arguments.
|
||||
The even is extracted from the passed labmda
|
||||
</summary>
|
||||
<typeparam name="TEventSource">The type of the event source.</typeparam>
|
||||
<param name="mockObject">The mock object.</param>
|
||||
<param name="eventSubscription">The event subscription.</param>
|
||||
<param name="args">The args.</param>
|
||||
</member>
|
||||
<member name="T:Rhino.Mocks.RhinoMocksExtensions.VoidType">
|
||||
<summary>
|
||||
Fake type that disallow creating it.
|
||||
Should have been System.Type, but we can't use it.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Rhino.Mocks.SetupResult">
|
||||
<summary>
|
||||
Setup method calls to repeat any number of times.
|
||||
|
15
csharp/ProtocolBuffers.Test/lib/nunit-license.txt
Normal file
15
csharp/ProtocolBuffers.Test/lib/nunit-license.txt
Normal file
@ -0,0 +1,15 @@
|
||||
Copyright © 2002-2007 Charlie Poole
|
||||
Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
|
||||
Copyright © 2000-2002 Philip A. Craig
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required.
|
||||
|
||||
Portions Copyright © 2002-2007 Charlie Poole or Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright © 2000-2002 Philip A. Craig
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source distribution.
|
25
csharp/ProtocolBuffers.Test/lib/rhino-license.txt
Normal file
25
csharp/ProtocolBuffers.Test/lib/rhino-license.txt
Normal file
@ -0,0 +1,25 @@
|
||||
Copyright (c) 2005 - 2008 Ayende Rahien (ayende@ayende.com)
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the name of Ayende Rahien nor the names of its
|
||||
contributors may be used to endorse or promote products derived from this
|
||||
software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
Loading…
Reference in New Issue
Block a user