Asp.net mvc 2 带有MVC模型验证问题的Specflow

Asp.net mvc 2 带有MVC模型验证问题的Specflow,asp.net-mvc-2,nunit,moq,specflow,Asp.net Mvc 2,Nunit,Moq,Specflow,在学习Specflow时,我使用Specflow、nunit和moq测试默认的MVC2应用程序注册 我有以下步骤来检查用户名和密码是否未输入 步骤 [Given(@"The user has not entered the username")] public void GivenTheUserHasNotEnteredTheUsername() { _registerModel = new RegisterModel

在学习Specflow时,我使用Specflow、nunit和moq测试默认的MVC2应用程序注册

我有以下步骤来检查用户名和密码是否未输入

步骤

[Given(@"The user has not entered the username")]
        public void GivenTheUserHasNotEnteredTheUsername()
        {   
            _registerModel = new RegisterModel
            {
                UserName = null,
                Email = "test@dummy.com",
                Password = "test123",
                ConfirmPassword = "test123"
            };      
        }

[Given(@"The user has not entered the password")]
        public void GivenTheUserHasNotEnteredThePassword()
        {
            _registerModel = new RegisterModel
            {
                UserName = "user" + new Random(1000).NextDouble().ToString(),
                Email = "test@dummy.com",
                Password = string.Empty,
                ConfirmPassword = "test123"
            };  
        }

[When(@"He Clicks on Register button")]
        public void WhenHeClicksOnRegisterButton ()
        {
            _controller.ValidateModel(_registerModel);
            _result = _controller.Register(_registerModel);
        }

[Then(@"He should be shown the error message ""(.*)""  ""(.*)""")]
        public void ThenHeShouldBeShownTheErrorMessage(string errorMessage, string field)
        {
            Assert.IsInstanceOf<ViewResult>(_result);
            var view = _result as ViewResult;
            Assert.IsNotNull(view);
            Assert.IsFalse(_controller.ModelState.IsValid);
            Assert.IsFalse(view.ViewData.ModelState.IsValidField(field));
            Assert.IsTrue(_controller.ViewData.ModelState.ContainsKey(field));          

            Assert.AreEqual(errorMessage,
            _controller.ModelState[field].Errors[0].ErrorMessage);
        }
我注意到返回的错误消息是密码和确认密码不匹配,但我不明白为什么所有其他测试,包括丢失确认密码测试(与丢失密码测试相同)都可以正常工作

有什么想法吗

功能

[Given(@"The user has not entered the username")]
        public void GivenTheUserHasNotEnteredTheUsername()
        {   
            _registerModel = new RegisterModel
            {
                UserName = null,
                Email = "test@dummy.com",
                Password = "test123",
                ConfirmPassword = "test123"
            };      
        }

[Given(@"The user has not entered the password")]
        public void GivenTheUserHasNotEnteredThePassword()
        {
            _registerModel = new RegisterModel
            {
                UserName = "user" + new Random(1000).NextDouble().ToString(),
                Email = "test@dummy.com",
                Password = string.Empty,
                ConfirmPassword = "test123"
            };  
        }

[When(@"He Clicks on Register button")]
        public void WhenHeClicksOnRegisterButton ()
        {
            _controller.ValidateModel(_registerModel);
            _result = _controller.Register(_registerModel);
        }

[Then(@"He should be shown the error message ""(.*)""  ""(.*)""")]
        public void ThenHeShouldBeShownTheErrorMessage(string errorMessage, string field)
        {
            Assert.IsInstanceOf<ViewResult>(_result);
            var view = _result as ViewResult;
            Assert.IsNotNull(view);
            Assert.IsFalse(_controller.ModelState.IsValid);
            Assert.IsFalse(view.ViewData.ModelState.IsValidField(field));
            Assert.IsTrue(_controller.ViewData.ModelState.ContainsKey(field));          

            Assert.AreEqual(errorMessage,
            _controller.ModelState[field].Errors[0].ErrorMessage);
        }
  • 场景:如果缺少用户名,则Register应返回错误
  • 给定用户尚未输入用户名
  • 当他点击注册按钮时
  • 然后应该向他展示错误 消息“用户名字段是必需的。”“用户名”

  • 场景:如果缺少密码,则寄存器应返回错误

  • 假设用户尚未输入 密码
  • 当他点击注册按钮时
  • 然后,应向他显示错误消息“'Password'必须至少为 6个字符长。““密码”
更新 好的,似乎帐户模型中的ValidatePasswordLengthaAttribute无法初始化
Membership.Provider
,因为我的app.config中没有connectionstring。Pembership.Provider是否正在连接到成员数据库

我添加了连接字符串,但现在测试通过了50%,因为它返回两个错误:

  • 需要密码
  • 密码长度必须为6个字符
问题是它们不是每次都以相同的顺序返回,因此测试是不可靠的。 我如何重写我的场景和测试来解释这一点?我仍然可以保留一个“Then”方法,还是需要创建一个新方法


谢谢。

我不得不将AccountService的连接字符串添加到nunit使用的App.config中。这导致ValidatePasswordLengthatTributor上出现错误

我已将检查正确错误消息的断言更新为:

Assert.AreEqual(errorMessage, 
            _controller.ModelState[field].Errors.First(e => e.ErrorMessage == errorMessage).ErrorMessage);
仍然不确定Membership.Provider是否正在访问数据库

Assert.AreEqual(errorMessage, 
            _controller.ModelState[field].Errors.First(e => e.ErrorMessage == errorMessage).ErrorMessage);