Повторное использование спецификации NSpec во внешнем контексте
Я изучаю рамки NSpec.
Вот мой пример. Я написал спецификацию для простого класса HttpRequester:
using Moq;
using NSpec;
namespace FooBrowser.UnitTests.BDD
{
class HttpRequester_specification : nspec
{
private HttpRequester requester;
private string sentData;
private int sendTimes;
private readonly Mock<IConnection> connectionMock;
private string resource;
public HttpRequester_specification()
{
connectionMock = new Mock<IConnection>();
connectionMock
.Setup(x => x.Send(It.IsAny<string>()))
.Callback<string>(data =>
{
sendTimes++;
sentData = data;
});
}
void given_opened_connection_with_no_recent_sends()
{
before = () =>
{
sendTimes = 0;
};
context["when HttpRequester is constructed"] = () =>
{
before = () => requester = new HttpRequester(connectionMock.Object);
it["should not do any request"] = () => sendTimes.should_be(0);
context["when performing request"] = () =>
{
act = () => requester.Request(resource);
context["when resource is not specified"] = () =>
{
it["should do 1 request"] = () => sendTimes.should_be(1);
it["should send HTTP GET / HTTP/1.0"] = () => sentData.should_be("GET / HTTP/1.0");
};
context["when resource is index.html"] = () =>
{
before = () => resource = "index.html";
it["should do 1 request"] = () => sendTimes.should_be(1);
it["should send HTTP GET /index.html HTTP/1.0"] = () => sentData.should_be("GET /index.html HTTP/1.0");
};
};
};
}
}
}
Как вы можете видеть, это ["должен выполнить 1 запрос"] = () => sendTimes.should_be(1); написано дважды.
Я пытаюсь переместить его во внешний контекст, как это:
context["when performing request"] = () =>
{
act = () => requester.Request(resource);
context["when resource is not specified"] = () =>
{
it["should send HTTP GET / HTTP/1.0"] = () => sentData.should_be("GET / HTTP/1.0");
};
context["when resource is index.html"] = () =>
{
before = () => resource = "index.html";
it["should send HTTP GET /index.html HTTP/1.0"] = () => sentData.should_be("GET /index.html HTTP/1.0");
};
it["should do 1 request"] = () => sendTimes.should_be(1);
};
Но это приводит к этому ["должен сделать 1 запрос"] = () => sendTimes.should_be(1); проверяется один раз для внешнего контекста, а не для внутренних, как я хочу.
Итак, могу ли я как-то переместить его во внешний контекст?
Или проще добавить некоторый код в NSpec, чтобы включить такое поведение?
Я нашел подобный вопрос здесь Повторное использование спецификаций NSpec, но я хочу сохранить синтаксис лямбда-выражений (без наследования), чтобы увидеть все спецификации в 1 месте.
1 ответ
Жаль видеть, что на это не отвечают в течение двух недель, но я обхожу это, просто извлекая метод
void ItShouldRequestExactly(int n)
{
it["should do " + n + " request"] = () => sendTimes.should_be(n);
}
Это достаточно СУХОЙ для меня в большинстве случаев. Однако вы получаете тонкие проблемы, когда передаете объекты, которые фактически инициализируются во время выполнения спецификации, но для этого простого примера он идеально подходит. К сожалению, я не вижу другого способа добавить такие смешанные утверждения в контекст.