Moq - 访问模拟对象的属性

Raj*_*Rao 3 moq

例如:我有一个属性和方法的接口.该方法使用属性的值来执行某些操作.如何设置模拟以访问属性的值?

interface myInterface
{
    Id{get;set;}
    string ReturnIdAsString();
}

Mock<myInterface> mock = new Mock<myInterface>();
mock.Setup(m => m.Id).Returns(1);
mock.Setup(m => m.ReturnsIdAsString).Returns(**would like to return m.Id here**);

mock.Object.ReturnsIdAsString(); //should return the value in m.Id 
Run Code Online (Sandbox Code Playgroud)

如何设置ReturnsIdAsString来访问属性Id?

Lun*_*ore 7

SetupGet用于属性.由于您正在模拟接口,因此不会有任何底层实现,您也必须设置该方法.

Mock<myInterface> mock = new Mock<myInterface>(){CallBase = true};
mock.SetupGet(m => m.Id).Returns(1);
mock.Setup(m => m.ReturnsIdAsString()).Returns("1");
Run Code Online (Sandbox Code Playgroud)

如果您打算更改Id属性的返回值,也可以使方法在返回时使用lambda .

mock.Setup(m => m.ReturnsIdAsString()).Returns(() => mock.Object.Id.ToString());
Run Code Online (Sandbox Code Playgroud)

请记住,即使您的类调用m.Id = 42它也不会更改Get属性,但您可以验证Set.

mock.VerifySet(m => m.Id = 42);
Run Code Online (Sandbox Code Playgroud)