これに対する通常の解決策は、データレイヤーを、よく知られたインターフェイスを実装する別のクラスに保持することです。例えば:
public interface IDataLayer
{
IEnumerable<Customer> GetAllCustomers();
Order GetOrderById(int id);
}
実際のデータアクセスに対して通常どおりインターフェイスを実装します
public class SqlServerDataLayer : IDataLayer
{
// implementation
}
ただし、テストでは、MoqやRhinoMocksなどのモックフレームワークを使用して、テストデータを返すモックデータレイヤーを設定できるようになりました。これにより、クラスがデータをどのように使用するかをテストするだけで済みます。これは理想的です。
[Test]
public void TestGettingCustomersRefreshesViewModel()
{
//arrange
var mockDb = new Mock<IDataLayer>();
mockDb.Setup(db => db.GetAllCustomers()).Returns(new List<Customer>());
underTest.DataRepository = mockDb.Object;
//act
underTest.GetCustomerCommand.Execute();
//assert
Assert.That(underTest.CustomerList != null);
}