【发布时间】:2017-07-02 20:31:18
【问题描述】:
我正在使用带有 FluentValidation 的 NancyFX,如 https://github.com/NancyFx/Nancy/wiki/Nancy-and-Validation 中所述。我的 Web 应用程序运行良好并且验证工作正常,但是当我尝试对任何使用验证的模块进行单元测试时,我收到一个错误
Nancy.Validation.ModelValidationException : No model validator factory could be located.
Please ensure that you have an appropriate validation package installed, such as
one of the Nancy.Validation packages.
我已验证我的单元测试项目引用了Nancy.Validation.FluentValidation 和FluentValidation 程序集。
我的测试代码如下所示:
public class ArticleModuleTests {
private Browser browser;
private IDatabase db;
const int USER_ID = 123;
const int ARTICLE_ID = 456;
[SetUp]
public void SetUp() {
var user = new User { Username = "test", Id = USER_ID };
db = A.Fake<IDatabase>();
browser = new Browser(with => {
with.Module<ArticleModule>();
with.RequestStartup((container, pipelines, context) => context.CurrentUser = user);
with.Dependency(db);
});
}
[Test]
public void User_Can_Publish_Article() {
var article = new { title = "Test" };
var result = browser.Post($"/users/{USER_ID}/articles", with => {
with.HttpRequest();
with.Body(JsonConvert.SerializeObject(article));
});
result.StatusCode.ShouldBe(HttpStatusCode.BadRequest);
}
}
我的模块代码是:
public class ArticlesModule : NancyModule {
private IDatabase database;
public ArticlesModule(IDatabase db) {
this.database = db;
Post["/users/{id:int}/articles"] = args => PostArticle(args.id);
}
private dynamic PostArticle(int userId) {
var article = this.Bind<Article>();
var validation = this.Validate(article);
if (!validation.IsValid) return Negotiate.WithModel(validation).WithStatusCode(HttpStatusCode.BadRequest);
database.CreateArticle(userId, article);
return NegotiatorExtensions.WithModel(Negotiate, result)
.WithStatusCode(HttpStatusCode.Created)
.WithHeader("Location", $"http://whatever/users/{userId}/articles/{article.Id}");
}
}
我的验证类是:
public class ArticleValidator : AbstractValidator<Article> {
public ArticleValidator() {
RuleFor(article => article.Title)
.NotEmpty()
.WithMessage("The \"title\" property is required");
RuleFor(article => article.Title)
.Length(2, 50)
.WithMessage("The \"title\" property must be between 2 and 50 characters");
}
}
NancyFX docs 说“创建一个验证类...无需在任何地方注册它,因为它会自动检测到。” - 但我猜想任何自动检测都不会触发单元测试项目。我在 .NET 4.5.2 上构建并使用 NCrunch 作为我的测试运行器;我需要做什么才能让我的测试代码选择与我的应用程序模块相同的验证类?
【问题讨论】:
-
Nancy.Validation.FluentValidation 不幸需要在单元测试项目中安装
-
它已安装,但 NCrunch 在构建测试项目时忽略了它。我已经更新了github.com/NancyFx/Nancy/wiki/Nancy-and-Validation,并附上了这样的注释。
标签: unit-testing nancy fluentvalidation