I haven’t been blogging a lot lately, and have not mentioned QuickNet recently.
Work has continued though. But as it’s still all quite experimental I’m reluctant to share it with the world.
Some QuickPreviews :
Me like this :
[Using(typeof(Login))]
[Using(typeof(Logout))]
public class NavigateSpecs : AcidTest<SecuredNavigatorState>
{
public NavigateSpecs() : base(50, 10) { }
[SpecFor(typeof(Navigate))]
public Spec ThrowsSecurityExceptionIfUserIsNotLoggedOn(string input, IResource output)
{
return
new Spec()
.If(State.UserIsNotLoggedOn)
.Throws<SecurityException>();
}
[SpecFor(typeof(Navigate))]
public Spec ReturnsAResourceIfUserIsLoggedOn(string input, IResource output)
{
return
new Spec(() => Ensure.NotNull(output))
.If(State.UserIsLoggedOn);
}
}
This is a rewrite of the example found on google code downloads. It defines specs on the navigate transition while still ‘using’ the login and logout transitions to get to certain states.
Also Agatha and QuickNet really play nice when it boils down to writing integration tests.
f.i. :
for the transition :
public class PrepareForGenerateOrderTransition : MetaTransition<PrepareForGenerateOrderRequest, PrepareForGenerateOrderResponse, State>
{
public PrepareForGenerateOrderTransition(State state)
{
Precondition = () => state.Current == (state.Current & (States.Editing));
GenerateInput = () => new PrepareForGenerateOrderRequest {Offer = state.OfferDto};
Execute =
i =>
{
var response = state.Dispatcher().Get<PrepareForGenerateOrderResponse>(i);
state.Current = States.InGenerateOrder;
state.OfferDto = response.Offer;
return response;
};
}
}
And then the spec :
[SpecFor(typeof(PrepareForGenerateOrderTransition))]
public Spec PrepareForGenerateOrderNoException(PrepareForGenerateOrderRequest input, PrepareForGenerateOrderResponse output)
{
return new Spec(() => Ensure.Null(output.Exception))
.If(() => input.Offer.CurrentSalesRep2ID > 0);
}
This is the result :
TestCase 'PrepareForGenerateOrderTransition PrepareForGenerateOrderNoException' failed: QuickNet.FalsifiableException : Expected : null. Actual : An ExceptionInfo whose value is: Corelio.SalesTool.Common.BusinessException: Line #1 in the offer has no edition yet. at Corelio.SalesTool.Business.PriceCalculation.CalculatorValidator.CheckWheterEachOfferDetailHasAProduct(Offer offer) in D:\Corelio-MAMS\MAMS\SalesTool\Business\PriceCalculation\CalculatorValidator.cs:line 21 at Corelio.SalesTool.Business.PriceCalculation.PriceCalculator.CalculatePrice(Offer offer) in D:\Corelio-MAMS\MAMS\SalesTool\Business\PriceCalculation\PriceCalculator.cs:line 62 at Corelio.SalesTool.Service.Offers.PrepareForGenerateOrderHandler.ExecuteOfferOperation(Offer offer) in D:\Corelio-MAMS\MAMS\SalesTool\Service\Offers\PrepareForGenerateOrderHandler.cs:line 34 at Corelio.SalesTool.Service.Offers.OfferHandler`2.Handle(TRequest request) in D:\Corelio-MAMS\MAMS\SalesTool\Service\Offers\OfferHandler.cs:line 26 at Agatha.ServiceLayer.RequestHandler`2.Handle(Request request) in D:\DotNetDev\agatha-rrsl\Agatha.ServiceLayer\RequestHandler.cs:line 72 at IRequestHandler`1Proxyc2453212705444138a4974dd6f97b51d.InvocationHandle_2.InvokeMethodOnTarget() at Castle.DynamicProxy.AbstractInvocation.Proceed() at Corelio.SalesTool.Business.Repo.WithUnitOfWork.Intercept(IInvocation invocation) in D:\Corelio-MAMS\MAMS\SalesTool\Business\Repo\WithUnitOfWork.cs:line 17 at Castle.DynamicProxy.AbstractInvocation.Proceed() at Corelio.SalesTool.Business.Repo.WithAOUnitOfWork.Intercept(IInvocation invocation) in D:\Corelio-MAMS\MAMS\SalesTool\Business\Repo\WithAOUnitOfWork.cs:line 15 at Castle.DynamicProxy.AbstractInvocation.Proceed() at IRequestHandler`1Proxyc2453212705444138a4974dd6f97b51d.Handle(Request request) at Agatha.ServiceLayer.RequestProcessor.GetResponseFromHandler(Request request, IRequestHandler responseHandler) in D:\DotNetDev\agatha-rrsl\Agatha.ServiceLayer\RequestProcessor.cs:line 128. D:\DotNetDev\QuickSuite\QN\QuickNet\Ensure.cs(23,0): at QuickNet.Ensure.Null(Object value) D:\Corelio-MAMS\MAMS\SalesTool\QuickNetTests\Specs.cs(46,0): at QuickNetTests.Specs.<>c__DisplayClassc.<PrepareForGenerateOrderNoException>b__b() D:\DotNetDev\QuickSuite\QN\QuickNet\Spec.cs(103,0): at QuickNet.Spec.VerifyInvariant(ITestRunReport report) Output from PrepareForGenerateOrderTransition PrepareForGenerateOrderNoException: no configuration section <common/logging> found - suppressing logging output ---------------------------------------------------------- PrepareForGenerateOrderTransition PrepareForGenerateOrderNoException Falsifiable after 6 test(s), 3 Transition(s). --------------------Simplest Fail Case-------------------- 1 : Transition : NewOfferTransition, Output : Corelio.SalesTool.RequestsAndResponses.Offers.GetNewOfferResponse Corelio.SalesTool.RequestsAndResponses.Offers.GetNewOfferRequest 2 : Transition : PrepareForGenerateOrderTransition, Output : Corelio.SalesTool.RequestsAndResponses.Offers.PrepareForGenerateOrderResponse Corelio.SalesTool.RequestsAndResponses.Offers.PrepareForGenerateOrderRequest ---------------------------------------------------------- 0 passed, 1 failed, 0 skipped, took 17,03 seconds.
As I said experimental, the bit operations will be abstracted f.i.

