2016-07-04 8 views
0

Я пытаюсь модульного тестирования метод, который проверяет наличие запроса в OwinContext.Request.Query и изменяет егоКак издеваются 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

ответ

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&lt;T&gt;"/> 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, вызываемый в запросе контекстного запроса, работает с поддельными данными.

+0

это работает очень хорошо – Shetty

1

Я знаю, что вы спросили о moq, но мы используем typemock, что делает тесты намного проще. Я поставлю его здесь, чтобы другие разработчики могли выбрать

[TestMethod,Isolated] 
public void Isolate_OwinContext_Request_Query_Should_Be_Queryable() 
{ 
    // Arrange 
    var key = Constants.AuthorizeRequest.ClientId; 
    var collection = new Dictionary<string, string[]>() { 
     {key, new[]{"1", "2", "3"} }, 
     {"B", new[]{"4", "5", "6"} } 
    }; 

    // Can it be simpler than this? 
    var fakeContext = Isolate.Fake.Instance<IOwinContext>(); 
    Isolate.WhenCalled(() => fakeContext.Request.Query). 
     WillReturnCollectionValuesOf(collection.AsQueryable()); 

    // Act 
    var result = Program.SetUpQuery(fakeContext, null); 

    // Assert 
    CollectionAssert.AreEquivalent(collection[key], result); 

} 
Смежные вопросы