测试这一点的一种方法是,将处理特定颜色球的责任分解为依赖关系,例如,
:
var bucketHandler = MockRepository.GenerateStub<IBuckerHandler>();
var bucketsOfFun = new BucketGame(bucketHandler);
...
bucketHandler.AssertWasCalled(x => x.HaveFunWithABucketOfBalls(redBalls));
bucketHandler.AssertWasCalled(x => x.HaveFunWithABucketOfBalls(greenBalls));
这个测试就是检查你的
正确调用
玩得开心
在模拟对象上。这可能仍然会给您指定每个参数应该是什么带来麻烦。反过来,您可以通过将分类球的责任推到一个新的依赖项上,从而使测试更容易(代价是引入更多的抽象)。然后你会得到这样的结果:
var balls = new List<IBall>();
var greenBalls = new List<IBall>();
var redBalls = new List<IBall>();
var sortedBalls = new [] { greenBalls, redBalls };
var bucketHandler = MockRepository.GenerateStub<IBucketHandler>();
var ballSorter = MockRepository.GenerateStub<IBallSorter>();
ballSorter.Stub(x => x.Sort(balls)).Return(sortedBalls);
var bucketsOfFun = new BucketGame(bucketHandler, ballSorter);
bucketsOfFun.HaveFunWithBucketsAndBalls(balls);
bucketHandler.AssertWasCalled(x => x.HaveFunWithABucketOfBalls(greenBalls));
bucketHandler.AssertWasCalled(x => x.HaveFunWithABucketOfBalls(redBalls));
为了通过这个测试
巴克游戏
:
public BucketGame(IBucketHandler bucketHandler, IBallSorter ballSorter)
{
this.bucketHandler = bucketHandler;
this.ballSorter = ballSorter;
}
public void HaveFunWithBucketsAndBalls(IList<IBall> balls)
{
var sortedBalls = ballSorter.Sort(balls);
foreach (var groupOfBalls in sortedBalls)
{
bucketHandler.HaveFunWithABucketOfBalls(groupOfBalls);
}
}
巴克游戏
逻辑。现在您需要为IBallSorter实现编写单元测试,以检查它是否根据需要按颜色对球进行排序。这些测试可能不需要任何模拟,您只需输入数据并断言您得到的数据是您所期望的。