FakeItEasy - 伪造 setter 行为来存储一个值然后 getter
FakeItEasy - faking setter behaviour to store a value and then getter
最终我想要一个带有 setter 的内部接口和一个带有 getter 的 public 接口。复制此场景的代码粗略如下:
[TestMethod]
public void TestMethod3()
{
var fake1 = A.Fake<IInterface1>(a => a.Implements(typeof(IInterface2)));
string backingString = null;
IInterface2 fake2 = (IInterface2)fake1;
A.CallTo(fake1)
.Where(a => a.Method.Name.Equals("set_Property"))
.Invokes((string param) => { backingString = param; });
A.CallTo(fake1)
.Where(a => a.Method.Name.Equals("get_Property"))
.WithReturnType<string>().Returns(backingString); //doesn't work
A.CallTo(fake2)
.Where(a => a.Method.Name.Equals("set_Property"))
.Invokes((string param) => { backingString = param; });
A.CallTo(fake2)
.Where(a => a.Method.Name.Equals("get_Property"))
.WithReturnType<string>().Returns(backingString); //doesn't work
fake1.Property = "asdf";
Assert.AreEqual("asdf", fake1.Property); //fails -> fake1.Property is null
Assert.AreEqual(fake1.Property, fake2.Property); //fails -> fake2.Property is null
}
}
public interface IInterface1
{
string Property { get; set; }
}
public interface IInterface2
{
string Property { get; }
}
我可以使用 backingString
来存储 setter,但是在设置 getter 时它无法正常工作。
我也尝试了 A.CallTo(() => fake1.Property).Returns(backingString)
行中的一些东西,但无济于事。
非常感谢他们专家的帮助:)
当您设置
A.CallTo(fake1)
.Where(a => a.Method.Name.Equals("get_Property"))
.WithReturnType<string>().Returns(backingString);
(fake2
也类似),
backingString
的值是 null
,所以这就是您稍后访问 Property
getter.[=19= 时 return 编辑的内容]
为了在 Property
getter 被调用时 return backingString
的值 ,你想要ReturnsLazily.
在每个地方进行此更改并通过测试:
A.CallTo(fake1)
.Where(a => a.Method.Name.Equals("get_Property"))
.WithReturnType<string>().ReturnsLazily(() => backingString);
最终我想要一个带有 setter 的内部接口和一个带有 getter 的 public 接口。复制此场景的代码粗略如下:
[TestMethod]
public void TestMethod3()
{
var fake1 = A.Fake<IInterface1>(a => a.Implements(typeof(IInterface2)));
string backingString = null;
IInterface2 fake2 = (IInterface2)fake1;
A.CallTo(fake1)
.Where(a => a.Method.Name.Equals("set_Property"))
.Invokes((string param) => { backingString = param; });
A.CallTo(fake1)
.Where(a => a.Method.Name.Equals("get_Property"))
.WithReturnType<string>().Returns(backingString); //doesn't work
A.CallTo(fake2)
.Where(a => a.Method.Name.Equals("set_Property"))
.Invokes((string param) => { backingString = param; });
A.CallTo(fake2)
.Where(a => a.Method.Name.Equals("get_Property"))
.WithReturnType<string>().Returns(backingString); //doesn't work
fake1.Property = "asdf";
Assert.AreEqual("asdf", fake1.Property); //fails -> fake1.Property is null
Assert.AreEqual(fake1.Property, fake2.Property); //fails -> fake2.Property is null
}
}
public interface IInterface1
{
string Property { get; set; }
}
public interface IInterface2
{
string Property { get; }
}
我可以使用 backingString
来存储 setter,但是在设置 getter 时它无法正常工作。
我也尝试了 A.CallTo(() => fake1.Property).Returns(backingString)
行中的一些东西,但无济于事。
非常感谢他们专家的帮助:)
当您设置
A.CallTo(fake1)
.Where(a => a.Method.Name.Equals("get_Property"))
.WithReturnType<string>().Returns(backingString);
(fake2
也类似),
backingString
的值是 null
,所以这就是您稍后访问 Property
getter.[=19= 时 return 编辑的内容]
为了在 Property
getter 被调用时 return backingString
的值 ,你想要ReturnsLazily.
在每个地方进行此更改并通过测试:
A.CallTo(fake1)
.Where(a => a.Method.Name.Equals("get_Property"))
.WithReturnType<string>().ReturnsLazily(() => backingString);