C# Autofixture模拟接口以返回随机结果以进行测试 问题

C# Autofixture模拟接口以返回随机结果以进行测试 问题,c#,unit-testing,moq,autofixture,C#,Unit Testing,Moq,Autofixture,我有一个相当大的应用程序,它利用了许多其他服务。 对于测试场景,我不希望我的单元测试依赖于第三方系统,所以我想用赝品或仿制品或其他东西来替换服务 我已经完成了大部分艰苦的工作,并用iSeries设备取代了具体的服务。具体的服务与DI框架连接在一起 现在我想用随机生成的赝品来代替这些 代码 示例服务的接口: 示例服务工厂的接口: 实现尽可能简单 这看起来有点乱,这是一个非常小的界面。 实际的服务有很多层次,有100种方法 对于代码中需要特定条件的方法,我显然仍然会手动设置这些条件,但默认情况下,其

我有一个相当大的应用程序,它利用了许多其他服务。 对于测试场景,我不希望我的单元测试依赖于第三方系统,所以我想用赝品或仿制品或其他东西来替换服务

我已经完成了大部分艰苦的工作,并用
iSeries设备
取代了具体的服务。具体的服务与DI框架连接在一起

现在我想用随机生成的赝品来代替这些

代码 示例服务的接口: 示例服务工厂的接口: 实现尽可能简单 这看起来有点乱,这是一个非常小的界面。 实际的服务有很多层次,有100种方法

对于代码中需要特定条件的方法,我显然仍然会手动设置这些条件,但默认情况下,其他所有内容都应该是随机值。生成大量随机对象也允许进行一些模糊测试


有没有一种方法可以在没有所有这些手动设置的情况下自动生成随机对象?

您不需要工厂,也不需要在接口中设置每个方法,如果我理解正确,您只需要使用Fixture创建一个代理,该代理为您在该代理上调用的每个方法返回随机值。使用AutoConfiguredMoqCustomization代替AutoMoqCustomization。这都在名为Fixture.AutoMoq的nuget包中

class Program
{
    static void Main(string[] args)
    {
    }
}

[TestFixture]
public class program
{
    [Test]
    public void some_test()
    {
        var fixture = new Fixture();
        fixture.Customize(new AutoConfiguredMoqCustomization());

        var simpleServices = fixture.CreateMany<ISimpleService>();

        foreach (var simpleService in simpleServices)
        {
            string randomString = simpleService.Buzz("hello");
            int randomInt = simpleService.Fizz(15);
        }
    }
}

public interface ISimpleService
{
    int Fizz(int input);

    string Buzz(string input);
}
类程序
{
静态void Main(字符串[]参数)
{
}
}
[测试夹具]
公共课程
{
[测试]
公共无效测试()
{
var fixture=新fixture();
fixture.Customize(新的AutoConfiguredMoqCustomization());
var simpleServices=fixture.CreateMany();
foreach(simpleServices中的var simpleService)
{
string randomString=simpleService.Buzz(“你好”);
int randomInt=simpleService.Fizz(15);
}
}
}
公共接口是简单的服务
{
int Fizz(int输入);
字符串嗡嗡声(字符串输入);
}

AFAICT,由于所述原因,这是不可能的。请注意,
AutoConfiguredMoqCustomization
已过时,可能会被删除。您可以改用
new AutoMoqCustomization{ConfigureMembers=true}
customization。
public interface ISimpleServiceFactory
{
    ISimpleService Create();
}
public static void Main(string[] args)
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    var service = fixture.Create<ISimpleService>();

    var fizzResult = service.Fizz(42);
    var buzzResult = service.Buzz("I'd like something random...");
}
public static void Main(string[] args)
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    var serviceMock = fixture.Create<Mock<ISimpleService>>();

    // These two lines below cause the magic now
   serviceMock.Setup(x => x.Fizz(It.IsAny<int>())).Returns(fixture.Create<int>());
   serviceMock.Setup(x => x.Buzz(It.IsAny<string>())).Returns(fixture.Create<string>());

    var service = serviceMock.Object;
    var fizzResult = service.Fizz(42);
    var buzzResult = service.Buzz("I'd like something random...");
}
public static void Main(string[] args)
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    var serviceFactoryMock = fixture.Create<Mock<ISimpleServiceFactory>>();

    var serviceMockDelegate = new Func<ISimpleService>(() =>
        {
            var serviceMock = fixture.Create<Mock<ISimpleService>>();
            serviceMock.Setup(x => x.Fizz(It.IsAny<int>())).Returns(fixture.Create<int>());
            serviceMock.Setup(x => x.Buzz(It.IsAny<string>())).Returns(fixture.Create<string>());

            return serviceMock.Object;
        });

    serviceFactoryMock.Setup(x => x.Create()).Returns(serviceMockDelegate);
    var service = serviceFactoryMock.Object.Create();

    var fizzResult = service.Fizz(42);
    var buzzResult = service.Buzz("I'd like something random...");
}
class Program
{
    static void Main(string[] args)
    {
    }
}

[TestFixture]
public class program
{
    [Test]
    public void some_test()
    {
        var fixture = new Fixture();
        fixture.Customize(new AutoConfiguredMoqCustomization());

        var simpleServices = fixture.CreateMany<ISimpleService>();

        foreach (var simpleService in simpleServices)
        {
            string randomString = simpleService.Buzz("hello");
            int randomInt = simpleService.Fizz(15);
        }
    }
}

public interface ISimpleService
{
    int Fizz(int input);

    string Buzz(string input);
}