我正在尝试使用OWIN内存服务器对WebAPI控制器进行单位测试,该内存中的服务器是从我的 [classInitialize] (MS test)方法调用的。我需要通过DI容器将存储库对象的模拟实例 ifoursquarerepository 注入我的控制器。OWIN服务器设置,静态ninject Ikernel实例及其绑定在WebAPI项目中的OWIN配置类中处理:
执行测试类[classInitialize]方法。 kernel.Bind<IFourSquareRepository>().ToMethod(
context =>
{
return MockRepository.GenerateMock<IFourSquareRepository>();
// This block runs only once ...
// But stubs from the test method return null when the test call
// fires up the controller ...
}
).InSingletonScope();
从测试项目中的测试方法中评估时,这些存根可预测工作(即:它们返回我在下面的存根定义中指定的值)。
my [testMethod] 案例为模拟接口的方法创建存根(ifoursquarerepository)我的控制器所依赖的方法,并调用解决我的WebAPI上的WebAPI端点控制器如下所示 - (当我发送httpclient请求时,我无法手动将模拟对象注入控制器实例 - 我依靠WebAPI管道来创建控制器实例,因此我必须使用DI容器来注入模拟的 ifoursquarerepository 对象进入控制器):
[TestMethod]
public void Test1_InMemServer()
{
var testRet = new BookmarkedPlace() { Id = 99 };
string userName = "Joe";
this.MockRepository.Stub(
repo => repo.GetFirstBookmarkedPlace()).Return(testRet);
// stub for test Repo IF method
// Act User the base class static HttpClient to talk to the Owin-hosted WebApi
var response = InMemoryTest.HttpClient.GetAsync( string.Format("/api/places/{0}", userName) ).Result;
var body = response.Content.ReadAsStringAsync().Result;
// Assert
Assert.IsTrue(response.IsSuccessStatusCode, "Request Failed ");
}
我的问题是,无论我做什么,当控制器(从上面的httpclient请求调用)调用固定方法时,它将返回null!
public IEnumerable<BookmarkedPlace> Get(string userName, int page = 0, int pageSize = 10)
{
IQueryable<BookmarkedPlace> query;
query = this.Repository.GetFirstBookmarkedPlace();
// Mock Repo call returning null !
// Other stuff goes here ...
return results;
}
我已经在这个问题上敲了几天 - 任何想法?
我认为原因是当您创建模拟存储库时,我确定后端必须使用某种上下文作为依赖的依赖,也将是固定的不会映射到实际的DBSET。
过去,我用以下方式嘲笑我的存储库并在基本测试类中获得DBSET的实例(因为这是一代人的常见)
public static IDbSet<T> GenerateSet<T>(IList<T> data) where T : class
{
IQueryable<T> queryable = data.AsQueryable();
IDbSet<T> dbSet = MockRepository.GenerateMock<IDbSet<T>, IQueryable>();
dbSet.Stub(x => x.Provider).Return(queryable.Provider);
dbSet.Stub(x => x.Expression).Return(queryable.Expression);
dbSet.Stub(x => x.ElementType).Return(queryable.ElementType);
dbSet.Stub(x => x.GetEnumerator()).Return(null).WhenCalled(x => queryable.GetEnumerator());
return dbSet;
}
,然后在初始化的测试类中:
[TestInitialize]
public new void Initialize()
{
base.Initialize();
_context = MockRepository.GenerateMock<YourContextInterface>();
_context.Stub(x => x.YourDbSet).PropertyBehavior();
_context.YourDbSet= GenerateSet(YourDbSet);
}