Честно говоря, я не могу сказать вам лучший способ сделать это в MSpec.Но я столкнулся с подобной проблемой взрыва класса с MSpec при использовании его в подобных обстоятельствах.Я не знаю, пробовал ли ты когда-нибудь RSpec.В RSpec контексты и спецификации строятся в пределах исполняемого кода.Это означает, что вы можете создать структуру данных, выполнить итерации и создать несколько контекстов и спецификаций, используя один блок кода.Это становится особенно удобным, когда вы пытаетесь определить, как ведет себя нечто, основанное на математике (основные факторы, крестики-нолики, шахматы и т. Д.).Для каждого члена набора заданных и ожидаемых значений может быть задан единый шаблон поведения.
Этот пример написан на NSpec, структуре контекста / спецификации для C #, смоделированной после RSpec.Я намеренно оставил провал спецификации.Я просто прошел этот ката достаточно далеко, чтобы найти место для использования итерации.Сбой спецификации заставляет вас устранить недостатки наивной реализации.
Вот еще один пример простого фактора ката: http://nspec.org/#dolambda
Вывод:
describe Knight
when moving 2 back and 1 left
when a knight at D4 is moved to B3
knight position should be B3
when a knight at C4 is moved to A3
knight position should be A3 - FAILED - String lengths are both 2. Strings differ at index 0., Expected: "A3", But was: "B3", -----------^
**** FAILURES ****
describe Knight. when moving 2 back and 1 left. when a knight at C4 is moved to A3. knight position should be A3.
String lengths are both 2. Strings differ at index 0., Expected: "A3", But was: "B3", -----------^
at ChessSpecs.describe_Knight.<>c__DisplayClass5.<when_moving_2_back_and_1_left>b__4() in c:\Users\matt\Documents\Visual Studio 2010\Projects\ChessSpecs\ChessSpecs\describe_Knight.cs:line 23
2 Examples, 1 Failed, 0 Pending
Код:
using System.Collections.Generic;
using NSpec;
class describe_Knight : nspec
{
void when_moving_2_back_and_1_left()
{
new Each<string,string> {
{"D4", "B3"},
{"C4", "A3"},
}.Do( (start, moveTo) =>
{
context["when a knight at {0} is moved to {1}".With(start,moveTo)] = () =>
{
before = () =>
{
knight = new Knight(start);
knight.Move(moveTo);
};
it["knight position should be {0}".With(moveTo)] = () => knight.Position.should_be(moveTo);
};
});
}
Knight knight;
}
class Knight
{
public Knight(string position)
{
Position = position;
}
public void Move(string position)
{
Position = "B3";
}
public string Position { get; set; }
}