2017-02-14 61 views
1

我正在使用NancyFX和FluentValidation,如https://github.com/NancyFx/Nancy/wiki/Nancy-and-Validation所述。我的web应用程序运行良好并验证可以正常使用,但是当我试图单元测试任何使用验证模块,我得到一个错误如何让我的NancyFX单元测试运行我的验证?

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.FluentValidationFluentValidation组件。

我的测试代码如下所示:

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($"https://stackoverflow.com/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["https://stackoverflow.com/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作为测试运行器;我需要做什么才能让我的测试代码像我的应用程序模块那样获取相同的验证类?

+0

Nancy.Validation.FluentValidation需要在单元测试项目中安装,不幸的是 – Jon

+0

它已经安装,但NCrunch在构建测试项目时忽略了它。我已经更新了https://github.com/NancyFx/Nancy/wiki/Nancy-and-Validation并提供了相应的说明。 –

回答

2

好的,事实证明,由于NancyFX自动检测并实例化验证类,因此我的代码中没有明确的参考信息Nancy.Validation.FluentValidation,因此NCrunch在构建我的测试项目时省略了此程序集。在NCrunch项目设置中设置“将引用的程序集复制到工作区”将其修复。

相关问题