我是新手,对使用模拟测试工具并不熟悉。但是,它的主要目的是什么?我将使用Moq来测试我的应用程序(和NUnit)。
例如,我有这样的代码:
我的网页代码后台:
public partial class MyWebpage
{
protected string GetTitle(string myVar)
{
return dataLayer.GetTitle(myVar);
}
}
我的数据访问层:
public class DataLayer
{
public string GetTitle(string myVar)
{
// Create the query we want
string query = "SELECT title FROM MyTable " +
"WHERE var = @myVar";
//ENTER PARAMETERS IN HERE
// Now return the result to the view
return this.dataProvider.ExecuteMySelectQuery(
dr =>
{
//DELEGATE DATA READER PASSED IN AND TITLE GETS RETURNED
},
query,
parameters);
}
}
我的数据提供者直接与数据库进行交互和通信:
public class DataProvider
{
public T ExecuteMySelectQuery<T>(Func<IDataReader, T> getMyResult, string selectQuery, Dictionary parameters)
{
//RUNS AND RETURNS THE QUERY
}
}
什么是测试所有这些的最佳方式?
Mock<IDataProvider> dataProviderMock = new Mock<IDataProvider>(MockBehavior.Strict);
然后将其传递给数据层,如下所示:var dataLayer = new DataLayer(dataProviderMock.Object);
- levelnisIt.IsAny<string>()
- 将更新测试。如果您需要将其传递到ExecuteMySelectQuery方法中,则可以在测试中为该值创建一个常量,并使用该常量表示传递给ExecuteMySelectQuery的参数。然后,您将该特定常量值传递给GetTitle。如果在调用ExecuteMySelectQuery时该字符串不同,则模拟将失败。 - levelnisIDataProvider
,则会得到一个测试,可以保证代码有效(只要没有人在测试后搞乱数据库)。模拟IDataProvider
无法做到这一点。 - jgauffin