【发布时间】:2015-10-22 04:40:24
【问题描述】:
版本 温莎城堡 3.3.0.0 Moq 4.2.1507.118
Moq 似乎带有 CallBase 设置,启用后,将对任何非设置方法的调用委托给基础对象。
var mock = new Mock<MyService> {CallBase = true};
不幸的是,一旦我在 Castle Windsor 注册它,所有非模拟方法都会立即返回 null,不再调用底层逻辑。
Container.Register(Component
.For<MyService>()
.Instance(mock.Object)
.LifeStyle.Singleton
);
我也尝试了几种不同的生活方式。
所以当我这样做时:
mock.setup(x => x.SomeMethod).Returns(myMockedData);
这按预期工作:
Container.Resolve<MyService>().SomeMethod();
但现在返回一个空值:
Container.Resolve<MyService>().AnotherMethod();
一旦我删除了模拟注册,AnotherMethod 就会像以前一样开始工作。
更具体的代码示例
public class Auth : IAuth
{
// mocked succesfully
public IEnumerable<T> AuthorizeData<T>(IEnumerable<T> data) { ... }
// never gets called
public virtual List<User> GetAllUsers() {
return new List<User>{new User{FIRST_NAME = "test"}};
}
}
模拟方法
protected static Mock<T> GetMock<T>() where T : class {
var mock = new Mock<T> {CallBase = true, DefaultValue = DefaultValue.Mock};
IoC.Container.Register(Component
.For<T>()
.Instance(mock.Object)
.LifeStyle.Transient
);
return mock;
}
模拟设置
GetMock<IAuth>().Setup(x => x.AuthorizeData(It.IsAny<IEnumerable<DO>>()))
.Returns((IEnumerable<DO> data) => data); // pass through input data (do not authorize
再次总结,AuthorizeData被mock成功,GetAllUsers()返回一个空列表。并且原始类永远不会被调用
【问题讨论】:
标签: dependency-injection moq castle-windsor ioc-container