Ejemplo n.º 1
0
        public async Task TestPostStringContent()
        {
            const string testString = "Test String";

            using (TestMemoryStore store = new TestMemoryStore())
                using (Cassette cassette = new Cassette(
                           store,
                           CassetteOptions.RecordedRequests & CassetteOptions.UseRecordedRequest,
                           logger: new OutputRecorderLogger(_output)))
                    using (TestHttpMessageHandler testHandler = new TestHttpMessageHandler(_output))
                    {
                        HttpRequestMessage  request;
                        StringContent       content;
                        HttpResponseMessage response;
                        using (HttpMessageHandler handler =
                                   cassette.GetHttpMessageHandler(testHandler, CassetteOptions.Overwrite))
                            using (HttpClient client = new HttpClient(handler))
                                using (request = new HttpRequestMessage(HttpMethod.Post, "https://test.handler/"))
                                    using (content = new StringContent(testString,
                                                                       // Attempt non-standard encoding (web normally uses UTF-8)
                                                                       Encoding.Unicode))
                                    {
                                        request.Content = content;

                                        // Store should not have been accessed yet
                                        Assert.Equal(0, store.GetAsyncCount);
                                        Assert.Equal(0, store.StoreAsyncCount);

                                        using (response = await client.SendAsync(request))
                                        {
                                            // Ensure test handler was called
                                            Assert.Equal(1, testHandler.CallCount);
                                            Assert.NotNull(response.Content);
                                            Assert.IsType <StreamContent>(response.Content);

                                            Assert.Equal(testString, await response.Content.ReadAsStringAsync());

                                            // As we're in overwrite mode we should not have queries the store.
                                            Assert.Equal(0, store.GetAsyncCount);
                                            Assert.Equal(1, store.StoreAsyncCount);

                                            // Should only be on item in store.
                                            Assert.Single(store);
                                        }
                                    }

                        // This time repeat the post in playback mode, which will error if not recorded properly above
                        using (HttpClient client = cassette.GetClient(CassetteOptions.Playback))
                            using (HttpRequestMessage request2 = new HttpRequestMessage(HttpMethod.Post, "https://test.handler/"))
                                using (StringContent content2 = new StringContent(testString,
                                                                                  // Attempt non-standard encoding (web normally uses UTF-8)
                                                                                  Encoding.Unicode))
                                {
                                    request2.Content = content2;
                                    using (HttpResponseMessage response2 = await client.SendAsync(request2))
                                    {
                                        // Ensure we didn't call message handler
                                        Assert.Equal(1, testHandler.CallCount);
                                        Assert.NotNull(response2.Content);
                                        Assert.IsType <StreamContent>(response2.Content);
                                        Assert.Equal(testString, await response2.Content.ReadAsStringAsync());

                                        // Ensure nothing was re-used
                                        Assert.NotSame(request, request2);
                                        Assert.NotSame(request, response2.RequestMessage);
                                        Assert.NotSame(response, response2);

                                        // One gets but only one set asked of store
                                        Assert.Equal(1, store.GetAsyncCount);
                                        Assert.Equal(1, store.StoreAsyncCount);


                                        // Should only be on item in store.
                                        Assert.Single(store);
                                    }
                                }
                    }
        }