私はアクセスせずにデータベースにアクセスする場合をシミュレートする方法を定義しようとしています...それはおそらくかなり狂っているようですが、そうではありません。Mockingはメソッド内にラップされた機能を置き換えることはできますか?
public IDevice GetDeviceFromRepository(string name)
{
IDevice device = null;
IDbConnection connection = new SqlConnection(ConnectionString);
connection.Open();
try
{
IDbCommand command = connection.CreateCommand();
command.CommandText = string.Format("SELECT DEVICE_ID,DEVICE_NAME FROM DEVICE WHERE DEVICE_NAME='{0}'", name);
IDataReader dataReader = command.ExecuteReader();
if(dataReader.NextResult())
{
device = new Device(dataReader.GetInt32(0),dataReader.GetString(1));
}
}
finally
{
connection.Close();
}
return device;
}
私が読まれているものを制御できるようにしたIDataReaderを模擬するふりをしています:ここで
は、私がテストしたい方法についての一例です。 (部品番号のフレームワークを使用して)そのような何か:
[TestMethod()]
public void GetDeviceFromRepositoryTest()
{
Mock<IDataReader> dataReaderMock = new Mock<IDataReader>();
dataReaderMock.Setup(x => x.NextResult()).Returns(true);
dataReaderMock.Setup(x => x.GetInt32(0)).Returns(000);
dataReaderMock.Setup(x => x.GetString(1)).Returns("myName");
Mock<IDbCommand> commandMock = new Mock<IDbCommand>();
commandMock.Setup(x => x.ExecuteReader()).Returns(dataReaderMock.Object);
Mock<RemoveDeviceManager> removeMock = new Mock<RemoveDeviceManager>();
removeMock.Setup()
RemoveDeviceManager target =new RemoveDeviceManager(new Device(000, "myName"));
string name = string.Empty;
IDevice expected = new Device(000, "myName"); // TODO: Initialize to an appropriate value
IDevice actual;
actual = target.GetDeviceFromRepository(name);
Assert.AreEqual(expected.SerialNumber, actual.SerialNumber);
Assert.AreEqual(expected.Name, actual.Name);
}
私の質問は、私は嘲笑1でのIDataReaderを交換する方法GetDeviceFromRepositoryを強制することができるかどうかです。
ここでの主な問題は、我々があることを行っているいくつかのレガシーコードを持っています新しいソリューションに適合します。 1つの要件は、単体テストと自動ビルドでカバレッジが95%以上となることです。私がしたいのは、屈折計をあまり実行せずにこのテストを迅速に実行し、日に複数回自動的にビルドするための外部リソース(データベース)にアクセスせずに、このカバレッジを達成するためのユニットテストを作成することです。これがこのアプローチに従う理由です。 –