
A unit test generation extension for Visual Studio that aims to always produce code that compiles - covering the basic cases automatically and preparing as much as it can for the complex cases.
Get the extension from the Visual Studio Marketplace:
Alternatively see the releases on GitHub:
Shows how Unitverse will omit null tests for parameters declared to explicitly accept null
public interface ITest { }
public class TestClass
{
    public TestClass(string notNullable, string? nullable)
    {
    }
    public TestClass(ITest? test)
    {
    }
    public TestClass(ITest test, string someOtherThing)
    {
    }
    public string GetFullName(string first, string? middle, string last) => middle != null ? $"{first} {middle} {last}" : $"{first} {last}";
    public void SomeMethod(ITest test, string someOtherThing)
    { }
    public void MethodForWhichNoNullabilityTestShouldBeEmitted(ITest? test)
    { }
}
public class TestClassTests
{
    private readonly TestClass _testClass;
    private string _notNullable;
    private string _nullable;
    private readonly ITest _testITest;
    private string _someOtherThing;
    public TestClassTests()
    {
        _notNullable = "TestValue534011718";
        _nullable = "TestValue237820880";
        _testITest = Substitute.For<ITest>();
        _someOtherThing = "TestValue1002897798";
        _testClass = new TestClass(_notNullable, _nullable);
    }
    [Fact]
    public void CanConstruct()
    {
        // Act
        var instance = new TestClass(_notNullable, _nullable);
        // Assert
        instance.Should().NotBeNull();
        // Act
        instance = new TestClass(_testITest);
        // Assert
        instance.Should().NotBeNull();
        // Act
        instance = new TestClass(_testITest, _someOtherThing);
        // Assert
        instance.Should().NotBeNull();
    }
    [Fact]
    public void CannotConstructWithNullTest()
    {
        FluentActions.Invoking(() => new TestClass(default(ITest), _someOtherThing)).Should().Throw<ArgumentNullException>().WithParameterName("test");
    }
    [Theory]
    [InlineData(null)]
    [InlineData("")]
    [InlineData("   ")]
    public void CannotConstructWithInvalidNotNullable(string value)
    {
        FluentActions.Invoking(() => new TestClass(value, _nullable)).Should().Throw<ArgumentNullException>().WithParameterName("notNullable");
    }
    [Theory]
    [InlineData("")]
    [InlineData("   ")]
    public void CannotConstructWithInvalidNullable(string value)
    {
        FluentActions.Invoking(() => new TestClass(_notNullable, value)).Should().Throw<ArgumentNullException>().WithParameterName("nullable");
    }
    [Theory]
    [InlineData(null)]
    [InlineData("")]
    [InlineData("   ")]
    public void CannotConstructWithInvalidSomeOtherThing(string value)
    {
        FluentActions.Invoking(() => new TestClass(_testITest, value)).Should().Throw<ArgumentNullException>().WithParameterName("someOtherThing");
    }
    [Fact]
    public void CanCallGetFullName()
    {
        // Arrange
        var first = "TestValue1657007234";
        var middle = "TestValue1412011072";
        var last = "TestValue929393559";
        // Act
        var result = _testClass.GetFullName(first, middle, last);
        // Assert
        throw new NotImplementedException("Create or modify test");
    }
    [Theory]
    [InlineData(null)]
    [InlineData("")]
    [InlineData("   ")]
    public void CannotCallGetFullNameWithInvalidFirst(string value)
    {
        FluentActions.Invoking(() => _testClass.GetFullName(value, "TestValue760389092", "TestValue2026928803")).Should().Throw<ArgumentNullException>().WithParameterName("first");
    }
    [Theory]
    [InlineData("")]
    [InlineData("   ")]
    public void CannotCallGetFullNameWithInvalidMiddle(string value)
    {
        FluentActions.Invoking(() => _testClass.GetFullName("TestValue217468053", value, "TestValue1379662799")).Should().Throw<ArgumentNullException>().WithParameterName("middle");
    }
    [Theory]
    [InlineData(null)]
    [InlineData("")]
    [InlineData("   ")]
    public void CannotCallGetFullNameWithInvalidLast(string value)
    {
        FluentActions.Invoking(() => _testClass.GetFullName("TestValue61497087", "TestValue532638534", value)).Should().Throw<ArgumentNullException>().WithParameterName("last");
    }
    [Fact]
    public void CanCallSomeMethod()
    {
        // Arrange
        var test = Substitute.For<ITest>();
        var someOtherThing = "TestValue687431273";
        // Act
        _testClass.SomeMethod(test, someOtherThing);
        // Assert
        throw new NotImplementedException("Create or modify test");
    }
    [Fact]
    public void CannotCallSomeMethodWithNullTest()
    {
        FluentActions.Invoking(() => _testClass.SomeMethod(default(ITest), "TestValue2125508764")).Should().Throw<ArgumentNullException>().WithParameterName("test");
    }
    [Theory]
    [InlineData(null)]
    [InlineData("")]
    [InlineData("   ")]
    public void CannotCallSomeMethodWithInvalidSomeOtherThing(string value)
    {
        FluentActions.Invoking(() => _testClass.SomeMethod(Substitute.For<ITest>(), value)).Should().Throw<ArgumentNullException>().WithParameterName("someOtherThing");
    }
    [Fact]
    public void CanCallMethodForWhichNoNullabilityTestShouldBeEmitted()
    {
        // Arrange
        var test = Substitute.For<ITest>();
        // Act
        _testClass.MethodForWhichNoNullabilityTestShouldBeEmitted(test);
        // Assert
        throw new NotImplementedException("Create or modify test");
    }
}