diff --git a/src/Objectivity.AutoFixture.XUnit2.Core.Tests/Requests/ValuesRequestTests.cs b/src/Objectivity.AutoFixture.XUnit2.Core.Tests/Requests/ValuesRequestTests.cs index c878f078..0f1b75c3 100644 --- a/src/Objectivity.AutoFixture.XUnit2.Core.Tests/Requests/ValuesRequestTests.cs +++ b/src/Objectivity.AutoFixture.XUnit2.Core.Tests/Requests/ValuesRequestTests.cs @@ -88,8 +88,8 @@ public void GivenDifferentTypeArguments_WhenConstructorIsInvoked_ThenParametersA Assert.Equal(values, attribute.Values); } - [Fact(DisplayName = "GIVEN valid arguments WHEN ToString is invoked THEN text conteins necessary information")] - public void GivenValidArguments_WhenToStringIsInvoked_ThenTextConteinsNecessaryInformation() + [Fact(DisplayName = "GIVEN valid arguments WHEN ToString is invoked THEN text contains necessary information")] + public void GivenValidArguments_WhenToStringIsInvoked_ThenTextContainsNecessaryInformation() { // Arrange var type = typeof(float); diff --git a/src/Objectivity.AutoFixture.XUnit2.Core.Tests/SpecimenBuilders/IgnoreVirtualMembersSpecimenBuilderTests.cs b/src/Objectivity.AutoFixture.XUnit2.Core.Tests/SpecimenBuilders/IgnoreVirtualMembersSpecimenBuilderTests.cs index ffd15730..1992300c 100644 --- a/src/Objectivity.AutoFixture.XUnit2.Core.Tests/SpecimenBuilders/IgnoreVirtualMembersSpecimenBuilderTests.cs +++ b/src/Objectivity.AutoFixture.XUnit2.Core.Tests/SpecimenBuilders/IgnoreVirtualMembersSpecimenBuilderTests.cs @@ -1,139 +1,162 @@ -namespace Objectivity.AutoFixture.XUnit2.Core.Tests.SpecimenBuilders -{ - using System; - using System.Diagnostics.CodeAnalysis; - using global::AutoFixture.Kernel; - using global::AutoFixture.Xunit2; - using Moq; - - using Objectivity.AutoFixture.XUnit2.Core.SpecimenBuilders; - - using Xunit; - - [Collection("IgnoreVirtualMembersSpecimenBuilder")] - [Trait("Category", "SpecimenBuilders")] - public class IgnoreVirtualMembersSpecimenBuilderTests - { - private readonly ISpecimenContext context = new Mock().Object; - - [Fact(DisplayName = "GIVEN default constructor WHEN invoked THEN reflected type should be null")] - public void GivenDefaultConstructor_WhenInvoked_ThenReflectedTypeShouldBeNull() - { - // Arrange - // Act - var builder = new IgnoreVirtualMembersSpecimenBuilder(); - - // Assert - Assert.Null(builder.ReflectedType); - } - - [AutoData] - [Theory(DisplayName = "GIVEN existing type WHEN constructor with parameter is invoked THEN that type should be reflected")] - public void GivenExistingType_WhenConstructorWithParameterIsInvoked_ThenThatTypeShouldBeReflected(Type reflectedType) - { - // Arrange - // Act - var builder = new IgnoreVirtualMembersSpecimenBuilder(reflectedType); - - // Assert - Assert.Same(reflectedType, builder.ReflectedType); - } - - [AutoData] - [Theory(DisplayName = "GIVEN uninitialized request WHEN Create is invoked THEN NoSpecimen is returned")] - public void GivenUninitializedRequest_WhenCreateInvoked_ThenNoSpecimenInstance( - [Modest] IgnoreVirtualMembersSpecimenBuilder builder) - { - // Arrange - // Act - var specimen = builder.Create(null, this.context); - - // Assert - Assert.IsType(specimen); - } - - [AutoData] - [Theory(DisplayName = "GIVEN not PropertyInfo request WHEN Create is invoked THEN NoSpecimen is returned")] - public void GivenNotPropertyInfoRequest_WhenCreateInvoked_ThenNoSpecimenInstance( - [Modest] IgnoreVirtualMembersSpecimenBuilder builder) - { - // Arrange - // Act - var specimen = builder.Create(new object(), this.context); - - // Assert - Assert.IsType(specimen); - } - - [AutoData] - [Theory(DisplayName = "GIVEN not virtual PropertyInfo request WHEN Create is invoked THEN NoSpecimen is returned")] - public void GivenNotVirtualPropertyInfoRequest_WhenCreateInvoked_ThenNoSpecimenInstance( - [Modest] IgnoreVirtualMembersSpecimenBuilder builder) - { - // Arrange - var notVirtualPropertyInfo = typeof(FakeObject).GetProperty(nameof(FakeObject.NotVirtualProperty)); - - // Act - var specimen = builder.Create(notVirtualPropertyInfo, this.context); - - // Assert - Assert.IsType(specimen); - } - - [AutoData] - [Theory(DisplayName = "GIVEN virtual PropertyInfo request but hosted in different type WHEN Create is invoked THEN NoSpecimen is returned")] - public void GivenVirtualPropertyInfoRequestHostedInDifferentType_WhenCreateInvoked_ThenNoSpecimenInstance( - [Frozen] Type reflectedType, - [Greedy] IgnoreVirtualMembersSpecimenBuilder builder) - { - // Arrange - var virtualPropertyInfo = typeof(FakeObject).GetProperty(nameof(FakeObject.VirtualProperty)); - - // Act - var specimen = builder.Create(virtualPropertyInfo, this.context); - - // Assert - Assert.Same(reflectedType, builder.ReflectedType); - Assert.IsType(specimen); - } - - [AutoData] - [Theory(DisplayName = "GIVEN virtual PropertyInfo request WHEN Create is invoked THEN OmitSpecimen is returned")] - public void GivenVirtualPropertyInfoRequest_WhenCreateInvoked_ThenOmitSpecimenInstance( - [Modest] IgnoreVirtualMembersSpecimenBuilder builder) - { - // Arrange - var virtualPropertyInfo = typeof(FakeObject).GetProperty(nameof(FakeObject.VirtualProperty)); - - // Act - var specimen = builder.Create(virtualPropertyInfo, this.context); - - // Assert - Assert.IsType(specimen); - } - - [Fact(DisplayName = "GIVEN virtual PropertyInfo request hosted in appropriate type WHEN Create is invoked THEN OmitSpecimen is returned")] - public void GivenVirtualPropertyInfoRequestHostedInAppropriateType_WhenCreateInvoked_ThenOmitSpecimenInstance() - { - // Arrange - var reflectedType = typeof(FakeObject); - var builder = new IgnoreVirtualMembersSpecimenBuilder(reflectedType); - var virtualPropertyInfo = reflectedType.GetProperty(nameof(FakeObject.VirtualProperty)); - - // Act - var specimen = builder.Create(virtualPropertyInfo, this.context); - - // Assert - Assert.IsType(specimen); - } - - [SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses", Justification = "Design required by tests.")] - [SuppressMessage("ReSharper", "All", Justification = "Design required by tests.")] - protected class FakeObject - { - public object NotVirtualProperty { get; set; } - - public virtual object VirtualProperty { get; set; } - } - } -} +namespace Objectivity.AutoFixture.XUnit2.Core.Tests.SpecimenBuilders +{ + using System; + using System.Diagnostics.CodeAnalysis; + using global::AutoFixture.Kernel; + using global::AutoFixture.Xunit2; + using Moq; + + using Objectivity.AutoFixture.XUnit2.Core.SpecimenBuilders; + + using Xunit; + + [Collection("IgnoreVirtualMembersSpecimenBuilder")] + [Trait("Category", "SpecimenBuilders")] + public class IgnoreVirtualMembersSpecimenBuilderTests + { + private readonly ISpecimenContext context = new Mock().Object; + + [Fact(DisplayName = "GIVEN default constructor WHEN invoked THEN reflected type should be null")] + public void GivenDefaultConstructor_WhenInvoked_ThenReflectedTypeShouldBeNull() + { + // Arrange + // Act + var builder = new IgnoreVirtualMembersSpecimenBuilder(); + + // Assert + Assert.Null(builder.ReflectedType); + } + + [AutoData] + [Theory(DisplayName = "GIVEN existing type WHEN constructor with parameter is invoked THEN that type should be reflected")] + public void GivenExistingType_WhenConstructorWithParameterIsInvoked_ThenThatTypeShouldBeReflected(Type reflectedType) + { + // Arrange + // Act + var builder = new IgnoreVirtualMembersSpecimenBuilder(reflectedType); + + // Assert + Assert.Same(reflectedType, builder.ReflectedType); + } + + [AutoData] + [Theory(DisplayName = "GIVEN uninitialized request WHEN Create is invoked THEN NoSpecimen is returned")] + public void GivenUninitializedRequest_WhenCreateInvoked_ThenNoSpecimenInstance( + [Modest] IgnoreVirtualMembersSpecimenBuilder builder) + { + // Arrange + // Act + var specimen = builder.Create(null, this.context); + + // Assert + Assert.IsType(specimen); + } + + [AutoData] + [Theory(DisplayName = "GIVEN not PropertyInfo request WHEN Create is invoked THEN NoSpecimen is returned")] + public void GivenNotPropertyInfoRequest_WhenCreateInvoked_ThenNoSpecimenInstance( + [Modest] IgnoreVirtualMembersSpecimenBuilder builder) + { + // Arrange + // Act + var specimen = builder.Create(new object(), this.context); + + // Assert + Assert.IsType(specimen); + } + + [AutoData] + [Theory(DisplayName = "GIVEN not virtual PropertyInfo request WHEN Create is invoked THEN NoSpecimen is returned")] + public void GivenNotVirtualPropertyInfoRequest_WhenCreateInvoked_ThenNoSpecimenInstance( + [Modest] IgnoreVirtualMembersSpecimenBuilder builder) + { + // Arrange + var notVirtualPropertyInfo = typeof(FakeObject).GetProperty(nameof(FakeObject.NotVirtualProperty)); + + // Act + var specimen = builder.Create(notVirtualPropertyInfo, this.context); + + // Assert + Assert.NotNull(notVirtualPropertyInfo.GetGetMethod()); + Assert.IsType(specimen); + } + + [AutoData] + [Theory(DisplayName = "GIVEN virtual PropertyInfo request but hosted in different type WHEN Create is invoked THEN NoSpecimen is returned")] + public void GivenVirtualPropertyInfoRequestHostedInDifferentType_WhenCreateInvoked_ThenNoSpecimenInstance( + [Frozen] Type reflectedType, + [Greedy] IgnoreVirtualMembersSpecimenBuilder builder) + { + // Arrange + var virtualPropertyInfo = typeof(FakeObject).GetProperty(nameof(FakeObject.VirtualProperty)); + + // Act + var specimen = builder.Create(virtualPropertyInfo, this.context); + + // Assert + Assert.NotNull(virtualPropertyInfo.GetGetMethod()); + Assert.Same(reflectedType, builder.ReflectedType); + Assert.IsType(specimen); + } + + [AutoData] + [Theory(DisplayName = "GIVEN virtual PropertyInfo request WHEN Create is invoked THEN OmitSpecimen is returned")] + public void GivenVirtualPropertyInfoRequest_WhenCreateInvoked_ThenOmitSpecimenInstance( + [Modest] IgnoreVirtualMembersSpecimenBuilder builder) + { + // Arrange + var virtualPropertyInfo = typeof(FakeObject).GetProperty(nameof(FakeObject.VirtualProperty)); + + // Act + var specimen = builder.Create(virtualPropertyInfo, this.context); + + // Assert + Assert.NotNull(virtualPropertyInfo.GetGetMethod()); + Assert.IsType(specimen); + } + + [AutoData] + [Theory(DisplayName = "GIVEN virtual PropertyInfo with private getter WHEN Create is invoked THEN NoSpecimen is returned")] + public void GivenVirtualPropertyInfoWithPrivateGetter_WhenCreateInvoked_ThenNoSpecimenInstance( + [Modest] IgnoreVirtualMembersSpecimenBuilder builder) + { + // Arrange + var propertyInfo = typeof(FakeObject).GetProperty(nameof(FakeObject.VirtualPropertyWithPrivateGetter)); + + // Act + var specimen = builder.Create(propertyInfo, this.context); + + // Assert + Assert.Null(propertyInfo.GetGetMethod()); + Assert.IsType(specimen); + } + + [Fact(DisplayName = "GIVEN virtual PropertyInfo request hosted in appropriate type WHEN Create is invoked THEN OmitSpecimen is returned")] + public void GivenVirtualPropertyInfoRequestHostedInAppropriateType_WhenCreateInvoked_ThenOmitSpecimenInstance() + { + // Arrange + var reflectedType = typeof(FakeObject); + var builder = new IgnoreVirtualMembersSpecimenBuilder(reflectedType); + var virtualPropertyInfo = reflectedType.GetProperty(nameof(FakeObject.VirtualProperty)); + + // Act + var specimen = builder.Create(virtualPropertyInfo, this.context); + + // Assert + Assert.NotNull(virtualPropertyInfo.GetGetMethod()); + Assert.IsType(specimen); + } + + [SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses", Justification = "Design required by tests.")] + [SuppressMessage("ReSharper", "All", Justification = "Design required by tests.")] + protected class FakeObject + { + public object NotVirtualProperty { get; set; } + + public virtual object VirtualProperty { get; set; } + + [SuppressMessage("Design", "CA1044:Properties should not be write only", Justification = "Required to test that GetGetMethod() returns null when getter is non-public.")] + public virtual object VirtualPropertyWithPrivateGetter { private get; set; } + } + } +} diff --git a/src/Objectivity.AutoFixture.XUnit2.Core/SpecimenBuilders/IgnoreVirtualMembersSpecimenBuilder.cs b/src/Objectivity.AutoFixture.XUnit2.Core/SpecimenBuilders/IgnoreVirtualMembersSpecimenBuilder.cs index 63c28ae0..3c74d82a 100644 --- a/src/Objectivity.AutoFixture.XUnit2.Core/SpecimenBuilders/IgnoreVirtualMembersSpecimenBuilder.cs +++ b/src/Objectivity.AutoFixture.XUnit2.Core/SpecimenBuilders/IgnoreVirtualMembersSpecimenBuilder.cs @@ -23,7 +23,7 @@ public object Create(object request, ISpecimenContext context) if (request is PropertyInfo pi //// is a property && (this.ReflectedType is null //// is hosted anywhere || this.ReflectedType == pi.ReflectedType) //// is hosted in defined type - && pi.GetGetMethod().IsVirtual) + && pi.GetGetMethod() is { IsVirtual: true }) { return new OmitSpecimen(); }