我想为HttpClient创建可模拟的处理程序,所以我将其定义如下:
type TestHandler() =
inherit HttpMessageHandler()
abstract SendAsync: HttpRequestMessage * CancellationToken -> Task<HttpResponseMessage>
override this.SendAsync(request, cancellationToken) = base.SendAsync(request, cancellationToken)但我知道错误是:
误差FS0361
覆盖SendAsync : HttpRequestMessage * CancellationToken -> Task<HttpResponseMessage>实现了多个抽象槽,例如abstract member TestHandler.SendAsync : HttpRequestMessage * CancellationToken -> Task<HttpResponseMessage>和HttpMessageHandler.SendAsync(request: HttpRequestMessage, cancellationToken: CancellationToken) : Task<HttpResponseMessage>。
我的目的是创建可以用Foq模拟的公共可覆盖方法,这个方法在基本SendAsync中被简单地调用。
如果我用不同的名称命名抽象方法,例如MockableSendAsync编译器不会抱怨,但是可以重用这个名称吗?(有可能使方法密封吗?)
发布于 2020-03-13 14:14:06
如果我正确地理解了这个问题,问题是HttpMessageHandler中的虚拟HttpMessageHandler方法是protected,但是希望创建一个public类型,这样就可以很容易地对其进行模拟。
我认为没有办法用F#中的另一种新的(公共) virutal方法隐藏虚拟方法,但我认为如果您定义了一个其他名称的virutal方法并从原始的SendAsync方法调用它,您的用例就会工作:
type TestHandler() =
inherit HttpMessageHandler()
abstract MockableSendAsync:
HttpRequestMessage * CancellationToken -> Task<HttpResponseMessage>
default this.MockableSendAsync(request, cancellationToken) =
base.SendAsync(request, cancellationToken)
override this.SendAsync(request, cancellationToken) =
this.MockableSendAsync(request, cancellationToken)https://stackoverflow.com/questions/60670052
复制相似问题