C# 自动夹具,类作为生成的类对象?

C# 自动夹具,类作为生成的类对象?,c#,autofixture,C#,Autofixture,我一直在研究,我开始认为这是可能的,但Autofixture有一些槽孔 在编写fakes类时,我在我的legit类中有一个States类,我想在fakes项目类中的类实例化中将其定义为Autofixture生成的对象 如下所示: namespace Geo.Fakes { public class State : MySpace.State, { public cBRCState() : base() { this = new Fixture<MySpace.Sta

我一直在研究,我开始认为这是可能的,但Autofixture有一些槽孔

在编写fakes类时,我在我的legit类中有一个
States
类,我想在fakes项目类中的类实例化中将其定义为Autofixture生成的对象

如下所示:

namespace Geo.Fakes {
public class State : MySpace.State, {
    public cBRCState() : base() {
        this = new Fixture<MySpace.State>().Create(); //can't do this
    }
}
但我不是在摸索如何让它真正起作用。我的方向对吗


编辑:澄清一下,这不是为了测试。这是为了向第三方提供虚假数据,而不让他们访问我们的真实数据或网络。我们的目标是让我们的假类代替真正的库,这样代码就相同了。因此,在我们的示例中,如果我说
MySpace.State State=new MySpace.State()
false.State State=new fake.State()
,我需要返回相同的对象,无论我们指向的是假库还是真库。由于Autofixture创建了一个类型为的对象,并在您创建fixture.Create()时将其交还给您,因此我需要一个伪的
State
类,该类使用Autofixture进行实例化,并充当
MySpace.State
,即使它是伪的。

如果我正确理解了这个问题,其目的是通过让第三方使用API来区分内部和外部行为。在这种情况下,我认为最好的选择是使用静态工厂方法,如下所示:

namespace Ploeh.StackOverflow.Q47914153.Geo.Fakes
{
    public class State : MySpace.State
    {
        private State()
        {
        }

        public static State Create()
        {
            return new Fixture().Build<State>().FromFactory(() => new State()).Create();
        }
    }
}
虽然我不确定我是否理解这个场景中的所有需求,但总体方法的某些方面对我来说并不真实。当复杂的创作逻辑对我隐藏时,我总是感到不安


您可以使用构建器模式而不是依赖随机值生成和继承吗?这里有一个例子,虽然我怀疑您在单元测试中不需要它,但您可以忽略测试数据生成器中的第一个单词…

我不确定我是否理解您试图实现的目标。如果我理解正确,您创建的新类仅用于测试目的,在您尝试测试的类上继承该类,并希望使用AutoFixture在基类中创建假值?需要这样做的场景是什么?如果您正试图编写一个特定的测试,那么如果您可以包含该测试以及您希望它执行的操作,以便我们更好地理解问题,这将非常有用。如果我说
fakes.State st=new fakes.State()
,我希望构造函数使用autofixture来
.Create()
并填充
赝品。使用数据和属性声明
。Autofixture返回一个原始类型的对象,其中包含填充的字段,因此我假设
fakes.State
将继承自
MySpace.State
。这不是为了测试。我们的类库进入数据库,第三家公司正在为我们做设计工作。我们不能给他们网络访问权,所以我们需要创建dll,这些dll就像我们的真实库一样使用,只是使用假数据,生成的数据很多。Manual=否。事实证明,我误解了项目的方向(在假类中包含属性,这样问题就可以解决了),我们不需要这样做。然而,这是我一直想去的方向。我缺少的是从工厂里建造。我将把你的问题标记为答案,因为这就是我最终要做的。干得好,先生。谢谢
namespace Ploeh.StackOverflow.Q47914153.Geo.Fakes
{
    public class State : MySpace.State
    {
        private State()
        {
        }

        public static State Create()
        {
            return new Fixture().Build<State>().FromFactory(() => new State()).Create();
        }
    }
}
[Fact]
public void DemoOfFactory()
{
    var state = Geo.Fakes.State.Create();

    Assert.IsType<Geo.Fakes.State>(state);
    Assert.NotEqual(default(string), state.TheText);
    Assert.NotEqual(default(int), state.TheNumber);
}