Если вы внимательно посмотрите на 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 Quarable list
/// </summary>
public static Mock<T> AsQuaryableMock<T, TItem>(this Mock<T> quaryableMock, IEnumerable<TItem> list)
where T : class,IEnumerable<TItem> {
var queryableList = list.AsQueryable();
quaryableMock.As<IQueryable<TItem>>().Setup(x => x.Provider).Returns(queryableList.Provider);
quaryableMock.As<IQueryable<TItem>>().Setup(x => x.Expression).Returns(queryableList.Expression);
quaryableMock.As<IQueryable<TItem>>().Setup(x => x.ElementType).Returns(queryableList.ElementType);
quaryableMock.As<IQueryable<TItem>>().Setup(x => x.GetEnumerator()).Returns(queryableList.GetEnumerator());
return quaryableMock;
}
}
С, что сделал все, что осталось, чтобы убедиться, чтобы создать некоторые поддельные данные, хранить его в словаре и установить его на макет из 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>().AsQuaryableMock(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, вызываемый в запросе контекстного запроса, работает с поддельными данными.
это работает очень хорошо – Shetty