开发者

How would you refactor a loop to have a unit test per each interation?

Let's say I have 开发者_Go百科a class which has a private void method. And I want to test this method by a some seed parameters for each specific iteration.

For instance, I want to make StartTrhoughGridCells method below testable for its iterations so that I can check statte changes in parameterObject.

In such cases, how can I make a each iteration testable in a private method that has a loop inside?

public class Traveller
{

// ... Some memebers, properties

private void StartTrhoughGridCells(object parameterObject)
{
   // Do some state changes on parameterObject
}

}


Unit testing is black box testing, so conceptually, testing specific private methods should never be a goal in itself. The unit tests don't care about private methods and they don't know about their existence. Now, when it comes to code coverage you'd want to hit all of the code, but that's not quite the same...

When writing unit tests you only care about observable effects. Presumably the StartTrhoughGridCells method exists to produce some kind of observable effect, so you'll need to test that. However, from the question I can't tell what that observable effect would be, so you'll have to figure that out for yourself.

In other words you'd need to hit the method through whatever public API you have. If that's too hard to do, it's a sign that your API is too coarse-grained. In that case, consider whether some of the private methods can't be refactored to composable Strategies or similar.


If your problem is that the method is private

Here is a suggested workaround

Add public method inside if DEBUG

#id DEBUG
public void StartTrhoughGridCells_ForTestOnly(object parameterObject) // Workaround
{
   StartTrhoughGridCells(parameterObject)
}
#endif

This way it won't exist in release Assuming your tests run on Debug version - they can test this method

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜