테스트 할 추상 클래스가 있습니다. 이 클래스에는 상속 된 클래스에서 정의하는 DAO에 대한 추상 속성이 있습니다.AutoFixture AutoMoq에서 속성을 사용하지 않습니다.
public abstract class DeviceGroupManagerBase<TDeviceGroup> where TDeviceGroup : DeviceGroup
{
protected abstract IDeviceGroupDao<TDeviceGroup> DeviceGroupDao { get; }
public TDeviceGroup UpdateDeviceIndexes(Device device)
{
return DeviceGroupDao.GetDeviceGroup(device.Group.Id);
}
}
은 내가 DeviceGroupDao
라는 속성을 조롱하기 위해 노력하고있어 그래서 Updatedeviceindexes 방법을 테스트하려는.
[TestFixture]
[Category("Unit")]
public class DeviceGroupManagerBaseTests
{
private IFixture fixture;
private Mock<DeviceGroupManagerBase<DeviceGroup>> subject;
private Mock<IDeviceGroupDao<DeviceGroup>> deviceGroupDaoMock;
private DeviceGroupManagerBase<DeviceGroup> Manager => subject.Object;
[TestFixtureSetUp]
public void Init()
{
fixture = new Fixture().Customize(new AutoMoqCustomization());
deviceGroupDaoMock = fixture.Freeze<Mock<IDeviceGroupDao<DeviceGroup>>>();
subject = fixture.Freeze<Mock<DeviceGroupManagerBase<DeviceGroup>>>();
}
[Test]
public void TestUpdateDeviceIndexes()
{
var device = fixture.Create<Device>();
var deviceGroup = fixture.Create<DeviceGroup>();
deviceGroupDaoMock.Setup(x => x.GetDeviceGroup(It.IsAny<int>())).Returns(deviceGroup);
var result = Manager.UpdateDeviceIndexes(device);
// The resultDeviceGroup will not be contain a previously defined object
Assert.AreEqual(deviceGroup.Id, result.Id);
}
}
나는이 방법으로 내 장치 개체에 대한 등록을 추가하려고 :
fixture.Register(() => deviceGroup);
하지만 난 여전히 새로운 객체를 얻고있다.
어떻게하면 IDeviceGroupDao<TDeviceGroup>
을 모의 할 수 있습니까?
이 답변은 디자인이 완전히 잠겨있는 경우에 유용합니다. 테스트에서는 유형을 안전하게 유지하면서 '보호 된'속성의 문제를 훌륭하게 해결합니다. 그것은 또한 Constructor Injection이 전반적으로 더 좋은 디자인이 될 것이라는 것을 보여줍니다. 그래서 스스로를 중복시키는 것이 이것의 또 다른 이점입니다. –