我正在尝试对在OwinContext.Request.Query
中检查查询并更改
public static async Task SetUpQuery(IOwinContext context, IClientStore clientConfig)
{
// Get the ClientId from Querystring
var clientIdQs = context.Request.Query.Where(x => x.Key == Constants.AuthorizeRequest.ClientId).Select(x => x.Value).FirstOrDefault();
// Some more code here
}
我正在使用Moq来模拟上下文。如何模拟Query
IReadableStringCollection
对象
答案 0 :(得分:3)
如果仔细查看IReadableStringCollection
,您会看到它继承自IEnumerable<KeyValuePair<string,string[]>
。我们知道的其他类/接口是从类似的东西继承而来的。 IDictionary<TKey,TValue>
。
所以我开始寻找模仿IEnumerable<KeyValuePair<string,string[]>
的方法。看看以下扩展方法
public static class MockQueryableExtensions {
/// <summary>
/// Converts a generic <seealso cref="System.Collections.Generic.IEnumerable<T>"/> to a <see cref="Moq.Mock"/> implementation of Queryable list
/// </summary>
public static Mock<T> AsQueryableMock<T, TItem>(this Mock<T> queryableMock, IEnumerable<TItem> list)
where T : class,IEnumerable<TItem> {
var queryableList = list.AsQueryable();
queryableMock.As<IQueryable<TItem>>().Setup(x => x.Provider).Returns(queryableList.Provider);
queryableMock.As<IQueryable<TItem>>().Setup(x => x.Expression).Returns(queryableList.Expression);
queryableMock.As<IQueryable<TItem>>().Setup(x => x.ElementType).Returns(queryableList.ElementType);
queryableMock.As<IQueryable<TItem>>().Setup(x => x.GetEnumerator()).Returns(queryableList.GetEnumerator());
return queryableMock;
}
}
完成所有操作后,剩下的就是确保创建一些假数据,将其存储在字典中并在模拟IReadableStringCollection
[TestClass]
public class OwinContextTests {
[TestMethod]
public void Mock_OwinContext_Request_Query_Should_Be_Queryable() {
//Arrange
var collection = new Dictionary<string, string[]>() {
{"A", new[]{"1", "2", "3"} },
{"B", new[]{"4", "5", "6"} }
};
//applying extension method
var queryMock = new Mock<IReadableStringCollection>().AsQueryableMock(collection);
var requestMock = Mock.Create<IOwinRequest>();
requestMock.Setup(m => m.Query).Returns(queryMock.Object);
var contextMock = Mock.Create<IOwinContext>();
contextMock.Setup(m => m.Request).Returns(requestMock.Object);
var key = "B";
var expected = collection[key];
//Act
var actual = SetUpQuery(contextMock.Object, key);
//Assert
Assert.IsNotNull(actual);
CollectionAssert.AreEqual(expected, actual);
}
public static string[] SetUpQuery(IOwinContext context, string Key) {
// Get the values from Querystring
var values = context.Request.Query.Where(x => x.Key == Key).Select(x => x.Value).FirstOrDefault();
return values;
}
}
上述测试通过调用上下文请求查询的linq查询与提供的虚假数据一起工作。
答案 1 :(得分:1)
我知道你问过moq但是我们使用typemock这使得测试变得更加简单。我会把它放在这里,以便其他开发人员可以选择
@Override
public void onBindViewHolder(final MarketListsViewHolder holder, final int position) {
mSpringListener.setsView(holder.market_lists_root);
holder.market_lists_root.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// When pressed start solving the spring to 1.
mScaleSpring.setEndValue(1);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
// When released start solving the spring to 0.
mScaleSpring.setEndValue(0);
break;
}
return true;
}
});
}
答案 2 :(得分:0)
我已经做到了,只是模拟您想模拟的任何值,
[TestMethod()]
public void GetRequestCorrelationIdTest()
{
Mock<IOwinContext> owinMock = new Mock<IOwinContext>(MockBehavior.Strict);
var requestMock = new Mock<IOwinRequest>();
var headers = new Mock<IHeaderDictionary>();
string valArr = "TestCorrelationId";
var keys = new Mock<ICollection<string>>(MockBehavior.Loose);
keys.Setup(m => m.Add("X-CorrelationId"));
headers.Setup(m=>m.Keys).Returns(keys.Object);
headers.Setup(m => m.Count).Returns(1);
requestMock.Setup(m => m.Headers).Returns(headers.Object);
requestMock.Setup(m => m.Headers["X-CorrelationId"]).Returns("TestCorrelationId");
owinMock.Setup(m => m.Request).Returns(requestMock.Object);
//Assigning the Context to the class
Utilities.OwinContext = owinMock.Object;
// Testing the code
var corelationId = Utilities.GetRequestCorrelationId();
Assert.AreEqual(corelationId, "valArr");
}