テストするクラスの現在のバージョンが与えられた場合
public class Registry {
private readonly RegistryManager _registryManager;
public Registry(RegistryManager rm) {
_registryManager = rm;
}
public async Task<string> GetDeviceKey(string deviceId = null) {
if (deviceId == null) {
throw new Exception("Todo replace");
}
var device = await _registryManager.GetDeviceAsync(deviceId);
if (device == null) {
throw new Exception("TODO replace");
}
return device.Authentication.SymmetricKey.PrimaryKey;
}
}
これをテストしたい場合は、RegistryManager
. 使用するサービスを抽象化して、本物を使用せずにテスト用にモック/偽造できるようにする必要があります。
何かのようなもの
public interface IRegistryManager {
Task<Device> GetDeviceAsync(string deviceId);
}
これにより、クラスを次のようにリファクタリングできます
public class Registry {
private readonly IRegistryManager _registryManager;
public Registry(IRegistryManager rm) {
_registryManager = rm;
}
public async Task<string> GetDeviceKey(string deviceId = null) {
if (deviceId == null) {
throw new Exception("Todo replace");
}
var device = await _registryManager.GetDeviceAsync(deviceId);
if (device == null) {
throw new Exception("TODO replace");
}
return device.Authentication.SymmetricKey.PrimaryKey;
}
}
これにより、Registry
クラスを完全にテストできるようになりました。レジストリ マネージャー フィールドのタイプ以外は何も変更する必要がないことに気付くでしょう。良い。
必要に応じてテスト フレームワークを使用して、偽物RegistryManager
またはモックアップを作成できるようになりました。
本番コードで実際の呼び出しを行う必要がある場合は、実際のものをインターフェイスでラップしてRegistry
クラスに渡すだけです
public class ActualRegistryManager : IRegistryManager {
private readonly RegistryManager _registryManager
public ActualRegistryManager (RegistryManager manager) {
_registryManager = manager;
}
public Task<Device> GetDeviceAsync(string deviceId) {
return _registryManager.GetDeviceAsync(deviceId);
}
}
このアプローチの良い点の 1 つは、依存クラスに本当に必要な機能のみを公開する必要があることです。
を使用Moq
して、次のテストでクラスFluentAssertions
をモックアップしてテストすることができましたRegistry
[TestMethod]
public async Task Registry_Should_Return_DeviceKey() {
//Arrange
var expectedPrimaryKey = Guid.NewGuid().ToString();
var deviceId = Guid.NewGuid().ToString();
var fakeDevice = new Device(deviceId) {
Authentication = new AuthenticationMechanism {
SymmetricKey = new SymmetricKey {
PrimaryKey = expectedPrimaryKey
}
}
};
var registryManagerMock = new Mock<IRegistryManager>();
registryManagerMock.Setup(m => m.GetDeviceAsync(deviceId))
.ReturnsAsync(fakeDevice);
var registry = new Registry(registryManagerMock.Object);
//Act
var deviceKey = await registry.GetDeviceKey(deviceId);
//Assert
deviceKey.Should().BeEquivalentTo(expectedPrimaryKey);
}
お役に立てれば。