Skip to content

Commit 3826dfb

Browse files
committed
Add test for no mocks declared exception
* Add a check for `PrimaryHandler` being null in the `MockClientHandler` class. * Throw a new exception with the message "no mocks were provided" if `PrimaryHandler` is null. --- For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/jkone27/fsharp-integration-tests?shareId=XXXX-XXXX-XXXX-XXXX).
1 parent 4c17015 commit 3826dfb

File tree

4 files changed

+72
-2
lines changed

4 files changed

+72
-2
lines changed

.devcontainer/devcontainer.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"tasks": {
3+
"test": "dotnet test",
4+
"build": "dotnet build"
5+
}
6+
}

ApiStub.FSharp/CE.fs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,4 +199,23 @@ module CE =
199199
|> ignore
200200
)
201201

202-
202+
type MockClientHandler(handler : HttpMessageHandler, methods, templateMatcher: TemplateMatcher, responseStubber) =
203+
inherit DelegatingHandler(handler)
204+
205+
override this.SendAsync(request, token) =
206+
let wrappedBase = new AsyncCallableHandler(base.InnerHandler)
207+
task {
208+
let routeDict = new RouteValueDictionary()
209+
if methods |> Array.contains(request.Method) |> not then
210+
return! wrappedBase.CallSendAsync(request, token)
211+
else if templateMatcher.TryMatch(request.RequestUri.AbsolutePath |> PathString, routeDict) |> not then
212+
return! wrappedBase.CallSendAsync(request, token)
213+
else
214+
if base.InnerHandler = null then
215+
raise (InvalidOperationException("no mocks were provided"))
216+
// HTTP response stubbing happens here, the request has matched, go on with the stub
217+
let! (expected : HttpResponseMessage) = responseStubber request routeDict
218+
// reattach original request!!!
219+
expected.RequestMessage <- request
220+
return expected
221+
}

test/ApiStub.FSharp.Tests.fsproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<Compile Include="BDDTests.fs" />
1010
<Compile Include="BuilderExtensionsTests.fs" />
1111
<Compile Include="StubberyTests.fs" />
12+
<Compile Include="Issues.fs" />
1213
<Content Include="swagger.json" />
1314
</ItemGroup>
1415
<ItemGroup>
@@ -34,4 +35,4 @@
3435
<ItemGroup>
3536
<PackageReference Update="FSharp.Core" Version="6.0.3" />
3637
</ItemGroup>
37-
</Project>
38+
</Project>

test/Issues.fs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
namespace ApiStub.FSharp.Tests
2+
3+
open Xunit
4+
open fsharpintegrationtests
5+
open Microsoft.AspNetCore.Mvc.Testing
6+
open Microsoft.Extensions.DependencyInjection
7+
open Microsoft.AspNetCore.Hosting
8+
open SwaggerProvider
9+
open System.Threading.Tasks
10+
open System.Net.Http
11+
open System
12+
open Microsoft.AspNetCore.TestHost
13+
open Microsoft.Extensions.Http
14+
open Microsoft.AspNetCore.Routing.Template
15+
open Microsoft.AspNetCore.Routing.Patterns
16+
open Microsoft.AspNetCore.Routing
17+
open System.Net
18+
open System.Text.Json
19+
open Microsoft.AspNetCore.Http
20+
open System.Net.Http.Json
21+
open Swensen.Unquote
22+
open ApiStub.FSharp.CE
23+
open ApiStub.FSharp.BuilderExtensions
24+
open ApiStub.FSharp.HttpResponseHelpers
25+
open ApiStub.FSharp
26+
open ApiStub.FSharp.BDD
27+
open HttpResponseMessageExtensions
28+
open Xunit.Abstractions
29+
30+
module IssuesTests =
31+
32+
let testce = new CE.TestClient<Startup>()
33+
34+
[<Fact>]
35+
let ``test_no_mocks_declared_throws_exception`` () =
36+
task {
37+
let factory = testce.GetFactory()
38+
let client = factory.CreateClient()
39+
40+
let! response = client.GetAsync("/Hello")
41+
Assert.False(response.IsSuccessStatusCode)
42+
let! responseString = response.Content.ReadAsStringAsync()
43+
Assert.Contains("no mocks were provided", responseString)
44+
}

0 commit comments

Comments
 (0)