[英]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());
}
}
問題
我希望能夠在我的步驟定義中使用Linq來檢查記錄是否已插入到各種表中。 上面的代碼在RiskClassesDataContext()
的構造函數上拋出NullReferenceException
。 我以前已經能夠創建RiskClassesDataContext的實例,所以我想知道這是否是因為我試圖從我的Specflow項目而不是從Web應用程序中做到這一點。
我的最后一個問題就是您是否認為這是測試我的項目的最佳方法。 硒是否可以通過數據庫查詢來測試我的整個項目,還是最好用Moq來代替。 或兩者兼而有之?
非常感謝
簡短的答案
RiskClassesDataContext
的代碼以確保,但是是的,它最有可能是因為在連接數據庫時丟失了某些內容。 長答案
為了確定這是否是最佳測試方法,您確實需要考慮要嘗試實現的測試類型。
現在,您可能要對自己說自己想要所有這些,或者它們都是相同的,但是實際上,這里有些微妙的不同。
這里的重點是SpecFlow可以用於所有這些事情。
如果您嘗試正確執行BDD,則實際上您已經與業務代表坐下來,並且在你們兩個之間,您已經為要實現的功能制定了許多方案。 當然,在考慮代碼之前,您已經完成了此操作。 只是為了避免將我們的思想鎖定在任何一種實現上:-)現在您可以坐下來實現您的綁定,以使它們失敗。
但是接下來呢? 好吧,當然,在這一點上我們要編寫一些新代碼,並且由於我們是優秀的開發人員,因此我們使用TDD來幫助我們。 而且由於我們正在進行單元測試,所以我們使用Mocks來幫助我們隔離每個代碼單元。 這導致我們的代碼不斷發展,因此在編寫了一些單元測試之后,我們的SpecFlow測試也通過了。
這導致我們將示例測試規范用作定義我們新功能的外部過程,而單元測試則是驅動代碼成功的內部循環。 紅綠重構雙循環。 此外,這意味着我們的SpecFlow測試范圍更大,並且可能包括對該數據庫的訪問。
所以現在如果我們回到我們的問題
請嘗試本文以獲取更多詳細信息。
最后一點,如果在測試中使用數據庫,則必須考慮如何在多個測試運行中使數據庫保持隔離。 看看使用-specflow-for-wpf-in-mvvm中的更多想法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.