Moq中SetupSet和SetupProperty之间的区别

Dot*_*nfo 11 c# unit-testing moq mocking

我知道SetupSet是在Moq中设置属性的旧方法.现在它是obsolette但是我的intellisense显示两者都没有标记为Obsolette.谁能指出我们之间的实际区别?

Dot*_*nfo 18

我可能发现其中一个不同之处如下.

如果您尝试模拟Readonly属性,则必须使用SetupGet,因为在这种情况下SetupProperty不起作用.如果要设置期望,SetupProperty可用于非只读属性.

例如,下面不起作用

public interface IXyz
{
  int Id { get; }
}

//Test Side Code    
var _mock = new Mock<IXyz>();
_mock.SetupProperty(x => x.Id, 1054);
Run Code Online (Sandbox Code Playgroud)

如果你尝试执行上面的代码,它会出现System.ArgumentException:Property IXyz.Id是只读的

因此,如果您将代码更改为以下,它将起作用

_mock.SetupGet(x => x.Id).Returns(1054);
Run Code Online (Sandbox Code Playgroud)


Jef*_*ata 13

SetupSet未标记为已过时.您可能会想到ExpectSet,它被标记为已废弃,并显示消息"ExpectSet已重命名为SetupSet".

SetupSet 让您指出将要设置属性的期望:

mock.SetupSet(x => x.Prop = "bar").Verifiable();
mock.Object.Prop = "foo";
mock.Verify();   // fails
Run Code Online (Sandbox Code Playgroud)

SetupProperty看起来像是一种在mock上存根属性的方法(参见文档的相同部分SetupSet).