簡體   English   中英

Specflow如何使用Linq查詢數據庫

[英]Specflow how to query database using Linq

上下文

我對.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來檢查記錄是否已插入到各種表中。 上面的代碼在RiskClassesDataContext()的構造函數上拋出NullReferenceException 我以前已經能夠創建RiskClassesDataContext的實例,所以我想知道這是否是因為我試圖從我的Specflow項目而不是從Web應用程序中做到這一點。

  2. 我的最后一個問題就是您是否認為這是測試我的項目的最佳方法。 硒是否可以通過數據庫查詢來測試我的整個項目,還是最好用Moq來代替。 或兩者兼而有之?

非常感謝

簡短的答案

  1. 我將需要查看RiskClassesDataContext的代碼以確保,但是是的,它最有可能是因為在連接數據庫時丟失了某些內容。
  2. 這種方法沒有什么錯,但是如果它的最佳方法取決於您要實現的目標。

長答案

為了確定這是否是最佳測試方法,您確實需要考慮要嘗試實現的測試類型。

  • 您是否正在嘗試編寫一些有助於編寫代碼的測試?
  • 您是否想提供一個全面的測試庫來證明您的代碼正確?
  • 您的測試是否應該證明您的解決方案正常工作?

現在,您可能要對自己說自己想要所有這些,或者它們都是相同的,但是實際上,這里有些微妙的不同。

  • 如果您想要一些測試只是為了幫助編寫代碼,那么在編寫代碼后阻止您放棄這些測試的是什么。
  • 如果您想證明您的代碼是正確的,那么您正在考慮進行單元測試,可能不在乎與數據庫對話,是的,Moq確實很有用(可以使用其他模擬庫)。
  • 如果您想證明您的解決方案可行,那么我們正在研究驗收測試,您確實需要證明您的代碼與數據庫之間的交互。

這里的重點是SpecFlow可以用於所有這些事情。

如果您嘗試正確執行BDD,則實際上您已經與業務代表坐下來,並且在你們兩個之間,您已經為要實現的功能制定了許多方案。 當然,在考慮代碼之前,您已經完成了此操作。 只是為了避免將我們的思想鎖定在任何一種實現上:-)現在您可以坐下來實現您的綁定,以使它們失敗。

但是接下來呢? 好吧,當然,在這一點上我們要編寫一些新代碼,並且由於我們是優秀的開發人員,因此我們使用TDD來幫助我們。 而且由於我們正在進行單元測試,所以我們使用Mocks來幫助我們隔離每個代碼單元。 這導致我們的代碼不斷發展,因此在編寫了一些單元測試之后,我們的SpecFlow測試也通過了。

這導致我們將示例測試規范用作定義我們新功能的外部過程,而單元測試則是驅動代碼成功的內部循環。 紅綠重構雙循環。 此外,這意味着我們的SpecFlow測試范圍更大,並且可能包括對該數據庫的訪問。

所以現在如果我們回到我們的問題

  • 您是否正在嘗試編寫一些有助於編寫代碼的測試?
  • SpecFlow可能是其中的一部分,但我建議您也使用TDD
  • 您是否想提供一個全面的測試庫來證明您的代碼正確?
  • 不用理會SpecFlow,只需使用nUnit和模擬
  • 您的測試是否應該證明您的解決方案正常工作?
  • 這就是SpecFlow的優勢所在,如果需要數據庫,請繼續

請嘗試本文以獲取更多詳細信息。

最后一點,如果在測試中使用數據庫,則必須考慮如何在多個測試運行中使數據庫保持隔離。 看看使用-specflow-for-wpf-in-mvvm中的更多想法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM