单元测试是开发人员对代码逻辑进行的测试,需要写单元测试代码来实现。单元测试里面是调用函数,根据返回的结果去判断代码逻辑是否正确。通常的操作是CRUD,除了查询之外的操作都是要与数据库打交道的。比如删除记录的函数在单元测试中被调用,记录就会被删掉,而此时开发人员很有可能需要这条记录来测试自己开发的功能是否正确,这样开发和测试就发生了冲突。
单元测试时可以使用MSTEST,通过PowerShell的脚本调用来跑的,很多团队使用自动化脚本来跑测试收集结果。数据库里的数据时刻都在变化,对于开发是很不利的,有没有一种机制能够把开发和测试分开呢,让做单元测试的时候不影响数据库。
Moq就是这样一种机制。Moq需要一个虚拟化对象,所以,被测试的实例需要继承一个接口或者抽象类。
接口(ISqlHelper):
public interface ISqlHelper
{
int Insert();
}
类(SqlHelper)
public class SqlHelper : ISqlHelper
{
public int Insert()
{
string connstr = @"data source=fuhui-pc\sqlexpress;Initial Catalog=WSCLMBPM;Integrated Security=True;";
string sql = "insert into UserInfo values('wyy','1234','wyy@wicresoft.com','120');";
SqlConnection conn = new SqlConnection(connstr);
int result = 0;
try
{
if(conn.State == ConnectionState.Closed)
conn.Open();
SqlCommand cmd = new SqlCommand
{
CommandType = CommandType.Text,
Connection = conn,
CommandText = sql
};
result = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
finally
{
if (conn.State == ConnectionState.Open)
conn.Close();
}
return result;
}
}
单元测试:
[TestClass]
public class UnitTest1
{
private int result = 1;
[TestMethod]
public void TestMethod1()
{
var sqlHelperMock = new Mock<ISqlHelper>();
sqlHelperMock.Setup(x => x.Insert()).Returns(1);
Assert.AreEqual(result, sqlHelperMock.Object.Insert());
sqlHelperMock.VerifyAll();
}
}
测试结果:
这时候我们发现数据库中并没有真正插入数据,但是单元测试已经通过了。