Specflow如何使用Linq查询数据库

时间:2013-03-09 13:20:27

标签: c# linq selenium mstest specflow

上下文

我对.NET比较陌生,决定在项目中使用BDD。我正在使用Specflow。

我使用Gherkin格式创建了一个特征文件并生成了步骤定义。

我正在使用Selenium将我的功能文件中的表格中的信息插入到网页中,我正在使用MSTest来测试结果。

我的步骤定义

[Binding]
public class RegisterSteps
{
    private IWebDriver ff = new FirefoxDriver();
    private string username = "";

    [Given(@"you are on the register page")]
    public void GivenYouAreOnTheRegisterPage()
    {         
        ff.Navigate().GoToUrl("http://localhost:55475/Register");
    }

    [Given(@"you enter the following information")]
    public void GivenYouEnterTheFollowingInformation(TechTalk.SpecFlow.Table table)
    {
        username = table.Rows[6]["Value"];
        for (var i = 0; i < table.RowCount; i++)
        {
            var field = table.Rows[i]["Field"];
            var value = table.Rows[i]["Value"];
            field = "mainContentPlaceHolder_TextBox" + field.Replace(" ", string.Empty);
            ff.FindElement(By.Id(field)).SendKeys(value);
        }
    }

    [When(@"you click submit")]
    public void WhenYouClickSubmit()
    {
        ff.FindElement(By.Id("mainContentPlaceHolder_Submit")).Click();
    }

    [Then(@"you should see the message ""(.*)""")]
    public void ThenYouShouldSeeTheMessage(string expectedMessage)
    {
        string message =  ff.FindElement(By.Id("mainContentPlaceHolder_LabelSuccess")).Text;
        Assert.AreEqual(message, expectedMessage);          
    }

    [Then(@"a record should be added to the table")]
    public void ThenARecordShouldBeAddedToTheTable()
    {
        RiskClassesDataContext db = new RiskClassesDataContext();
        var query = from ao in db.ActionOwners
                    where ao.username.Equals(username)
                    select ao;
        Assert.IsNotNull(query.First());
    }
}

问题

  1. 我希望能够在我的步骤定义中使用Linq来检查记录是否被插入到各种表中。上面的代码在NullReferenceException的构造函数上抛出RiskClassesDataContext()。我以前能够创建RiskClassesDataContext的实例,所以我想知道这是因为我是想从我的Specflow项目而不是从我的Web应用程序中执行此操作。

  2. 我的最后一个问题是您是否认为这是测试我的项目的最佳方法。是否有数据库查询的selenium可以测试我的整个项目,或者我最好使用说Moq。或者两者兼而有之?

  3. 非常感谢

1 个答案:

答案 0 :(得分:1)

简短答案

  1. 我需要查看RiskClassesDataContext的代码才能确定,但​​是,最可能的原因是因为您在连接数据库时丢失了某些内容。
  2. 这种方法没有任何问题,但如果它的最佳方法取决于你想要实现的目标。
  3. 长答案

    为了确定这是否是 Best 测试方式,您真的需要考虑尝试实现哪种类型的测试。

    • 您是否正在尝试编写一些可以帮助您编写代码的测试?
    • 您是否想要提供一个全面的测试库来证明您的代码是正确的?
    • 您的测试是否应该证明您的解决方案正常运行?

    现在,你可能会对自己说,你想要所有这些,或者它们都是一样的,但实际上这里有一些微妙的不同之处。

    • 如果你想要一些测试只是为了帮助你编写代码,那么什么是阻止你在编写代码后丢弃这些测试。
    • 如果你想证明你的代码是正确的,那么你正在考虑单元测试,可能不关心与数据库交谈,是的,Moq会非常有用(其他模拟库可用)。
    • 如果您想证明您的解决方案有效,那么我们正在考虑验收测试,您确实需要证明您的代码与数据库之间的交互。

    这里的要点是SpecFlow可以用于所有这些事情。

    如果您正在尝试正确地进行BDD,那么实际上您已与您的业务代表坐在一起,并且在您和您之间,您已经为您正在考虑实施的功能制定了许多方案。当然,在考虑您的代码之前,您已经完成了这项工作。所以我们不会将我们的想法锁定到任何一个实现:-)现在你可以坐下来实现你的绑定,以便它们失败。

    但接下来呢?当然,在这一点上,我们想要编写一些新代码,因为我们是优秀的开发人员,所以我们使用TDD来帮助我们。由于我们是单元测试,因此我们使用Mocks来帮助我们隔离每个代码单元。这导致我们的代码发展,以便在编写一些单元测试之后,我们的SpecFlow测试也会通过。

    这导致我们使用我们的规范示例测试作为外部流程,定义我们的新功能和单元测试是内部循环,推动代码走向成功。双红绿重构循环。此外,这意味着我们的SpecFlow测试范围更大,并且可以包括对该数据库的访问。

    现在,如果我们回到我们的问题

    • 您是否正在尝试编写一些可以帮助您编写代码的测试?
    • SpecFlow可以是其中的一部分,但我也建议使用TDD
    • 您是否想要提供一个全面的测试库来证明您的代码是正确的?
    • 不要打扰SpecFlow,只需使用nUnit和mocks
    • 您的测试是否应该证明您的解决方案正常运行?
    • 这是SpecFlow擅长的,如果它需要数据库,那么请继续

    尝试this article了解更多详情。

    最后一点,如果您在测试中使用数据库,则必须考虑如何在多次测试运行中将其隔离。有关此

    的更多想法,请查看using-specflow-for-wpf-in-mvvm