【问题标题】:How do I get my NancyFX unit tests to run my validation?如何让我的 NancyFX 单元测试运行我的验证?
【发布时间】: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 作为我的测试运行器;我需要做什么才能让我的测试代码选择与我的应用程序模块相同的验证类?

【问题讨论】:

标签: unit-testing nancy fluentvalidation


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 2016-02-24
    • 2015-02-03
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2013-01-07
    相关资源
    最近更新 更多