Tôi sử dụng AutoFixture 3.21.0, AutoFixture.AutoMoq 3.21.0, NUnit 2.6.3 và Moq 4.2.1409.1722.AutoConfiguredMoqTùy chỉnh với giao diện triển khai lớp trừu tượng
Tôi có giao diện sau, hai lớp trừu tượng (một trong số chúng triển khai giao diện này) và hai thử nghiệm đơn vị.
Kiểm tra vượt qua.
public interface IMigration
{
IMigrationParameters MigrationParameters { get; set; }
}
public abstract class AbstractSutWithoutInterface
{
public IMigrationParameters MigrationParameters { get; set; }
}
public abstract class AbstractSutWithInterface : IMigration
{
public IMigrationParameters MigrationParameters { get; set; }
}
[TestFixture]
public class UnitTests
{
[Test]
public void TestAbstractSutWithoutInterface()
{
var fixture = new Fixture();
fixture.Customize(new AutoConfiguredMoqCustomization());
var mock = fixture.Create<AbstractSutWithoutInterface>();
Assert.IsNotNull(mock.MigrationParameters); // test passes
}
[Test]
public void TestAbstractSutWithInterface()
{
var fixture = new Fixture();
fixture.Customize(new AutoConfiguredMoqCustomization());
var mock = fixture.Create<AbstractSutWithInterface>();
Assert.IsNull(mock.MigrationParameters); // test passes
}
}
Câu hỏi của tôi là lý do tại sao AutoConfiguredMoqCustomization đã hành vi khác nhau cho các lớp trừu tượng tuỳ thuộc vào việc tài sản được xác định bởi giao diện hay không? Trong tài sản thử nghiệm đầu tiên được khẳng định là không null nhưng trong thử nghiệm thứ hai là null. Nếu các lớp không trừu tượng, việc tiêm thuộc tính hoạt động như mong đợi cho cả hai lớp.
Các lớp đó có thiếu từ khóa 'abstract' không? –
@PatrickQuirk Cảm ơn bạn đã chỉ ra từ khóa bị thiếu trong mã nguồn. Tôi đã sửa chữa nó. – sgnsajgon
Tôi không thể tái tạo, trong cả hai trường hợp, chúng không phải là vô giá trị đối với tôi. Tôi đang sử dụng phiên bản AutoFixture mới nhất, bạn đang sử dụng phiên bản nào? –