C# FakeiTesy-检索伪造对象

C# FakeiTesy-检索伪造对象,c#,testing,mocking,tdd,fakeiteasy,C#,Testing,Mocking,Tdd,Fakeiteasy,有没有办法检索插入到伪造类中的伪造对象 例如 假设我有以下接口+类 public interface IFakeable { void FakeYou(); } public class SomeClass { private readonly IFakeable _fake; public SomeClass(IFakeable fake) { _fake = fake; } public void FakeCall()

有没有办法检索插入到伪造类中的伪造对象

例如

假设我有以下接口+类

public interface IFakeable
{
    void FakeYou();
}

public class SomeClass
{
    private readonly IFakeable _fake;

    public SomeClass(IFakeable fake)
    {
        _fake = fake;
    }

    public void FakeCall()
    {
        _fake.FakeYou();
    }
}
并想测试如下内容:

[TestFixture]
public class SomeClassTests
{
    [Test]
    public void FakeCall_CallsIFakeabl_FakeYou()
    {
        var subject = A.Fake<SomeClass>();

        subject.FakeCall();

        A.CallTo(() => A.Fake<IFakeable>().FakeYou()).MustHaveHappened();
    }
}
[TestFixture]
公共类测试
{
[测试]
公共无效虚假呼叫
{
var subject=A.Fake();
subject.FakeCall();
A.CallTo(()=>A.Fake().FakeYou())。一定发生过();
}
}
这是否可以在不公开
SomeClass.\u fake
字段的情况下实现


有什么地方我可以指定使用单例进行伪造吗?

这里更重要的是,为什么要测试在私有字段上调用的方法。私有字段封装在类中,因此方法对该字段所做的任何操作都构成“类的内部构件”,与测试无关。我假设FakeYou()实现有一些需要测试的重要副作用。在这种情况下,我将在subject.FakeCall()之后测试该副作用,而不是测试是否发生了FakeCall

或者,您可以将_fake更改为公共字段,并更改:

A.CallTo(() => A.Fake<IFakeable>().FakeYou()).MustHaveHappened();

ReSharper会告诉你,如果C约定是这样,你可能想将“_fake”重命名为“fake”。

如果测试的主题是
SomeClass
,你为什么要伪造它?你想测试实际的类,而不是假的。。。因此,您可能应该这样做:

[Test]
public void FakeCall_CallsIFakeabl_FakeYou()
{
    var fake = A.Fake<IFakeable>();
    var subject = new SomeClass(fake);

    subject.FakeCall();

    A.CallTo(() => fake.FakeYou()).MustHaveHappened();
}

我问这个问题的原因是,因为我经常想检查例如SaveChanges()是否在EF上下文中被调用。我找到了FakeItEasyAutoMocker,这和我为Moq创建的(Moqqer)是一样的。所以,我猜这是没有现成的支持。
[Test]
public void FakeCall_CallsIFakeabl_FakeYou()
{
    var fake = A.Fake<IFakeable>();
    var subject = new SomeClass(fake);

    subject.FakeCall();

    A.CallTo(() => fake.FakeYou()).MustHaveHappened();
}
[TestFixture]
public class SomeClassTests
{
    [Fake] public IFakeable Fake {get;set;}

    [UnderTest] public SomeClass Subject {get;set;}

    [SetUp]
    public void Setup()
    {
        Fake.InitializeFixture(this);
    }

    [Test]
    public void FakeCall_CallsIFakeabl_FakeYou()
    {
        Subject.FakeCall();

        A.CallTo(() => Fake.FakeYou()).MustHaveHappened();
    }
}