如何模拟OwinContext.Request.Query

时间:2016-07-04 15:19:22

标签: c# unit-testing moq owin

我正在尝试对在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 个答案:

答案 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&lt;T&gt;"/>  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");

    }