-
-
Save gregoryyoung/848b8febc158d7f6a424 to your computer and use it in GitHub Desktop.
public class AccountSpecifications | |
{ | |
const decimal perTransactionFee = 0.99m; | |
public Specification when_withdrawing_money() | |
{ | |
var currentBalance = 13.0m; | |
return new ActionSpecification<AccountContext> | |
{ | |
On = () => new AccountContext { | |
Account = new Account(currentBalance), | |
Command = new WithdrawCommand | |
{ | |
Amount = 12.00m | |
} | |
}, | |
When = account => account.Handle(cmd), | |
Expect = | |
{ | |
account => account.Balance == (currentBalance - cmd.Amount) - perTransactionFee, | |
account => account.CloseToZeroBalance | |
}, | |
}; | |
} | |
public class AccountContext { | |
public Command Command; | |
public Account Account; | |
} | |
} |
I'm not sure I'm following you. How that would work without generics? You won't get x.Command.Amount property due to x.Command being of some base command type.
To be clear on the ability to use it with just command. you can pretty easily write your own template to support this or could just drop in a dynamic :)
If you look in the other sepcification templates (which are just examples btw its expected that you may run your own) you will notice operations called transformedby you could do this there... or you could just do this
CommandContext {
dynamic sut;
Command command;
}
yeah I know not the most beautiful do you really need strong typing here?
Anyway, having specs defined as fields leads to inconvenient developer experience with test runners
Strong-typing? Why not? :)
If you want strong typing just make your own template (like what ActionSpecification does).
For runners I know all about fields :) I built all that support into mighty moose for simple.testing and for machine.specs
btw for a reference see:
At the end of the day its just doing Expect(When(Given())) you can change what the pipeline types are along the way (the templates just give strong typing to it as a template)
ok, I'll have a look. Tnx!
for current balance
and no you dont need to make a generic depending on how you wire things up. If you have a Command interface you can easily reuse it.