我正在使用构造函数注入模式来插入带有moq的模拟。
所以我在我的nunit测试中有这样的东西
property UserMock
property IService // interface
public void PreSetup()
{
UserMock = new UserMock;
ITaskService = new Service(UserMock.object);
}
现在我有一个像这样的单元测试方法
public void TestSomething()
{
UserMock.Setup(u => u.SomeMethod(It.IsAny<string>()));
}
现在我以为我总是必须这样做。
public void TestSomething()
{
UserMock.Setup(u => u.SomeMethod(It.IsAny<string>()));
ITaskService.User = UserMock.Object
}
似乎我不必这样做。就像我的想法一样,对象被传递到构造函数中,其中的内容被设置到TaskServiceClass中的“User”属性中。
因此,如果我稍后来到某个方法并添加一些内容,除非我重置该对象,否则它不会被设置。
似乎并非如此。那么我不理解的是什么?
由于
答案 0 :(得分:1)
这是所有猜测:但UserMock.Object.SomeMethod可能在其父级调用自定义方法,如在UserMock.SomeMethod中。至少在UserMock.Object上更改SomeMethod的定义而不创建新对象。
因此,将UserMock.Object传递给构造函数工作正常,因为如果我是对的,ITaskService会保存对UserMock.Object的引用,该引用包含对UserMock的引用,可以自由更改其对SomeMethod的处理而不会丢失连接已在PreSetup中建立。