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();
}
}