Я бы не ожидал, что есть способ заставить это работать с Moq.Библиотека Moq предполагает, что код следует обычным методам кодирования C #, и способ, которым F # компилирует методы с несколькими параметрами в форме с карри, просто не тот способ, которым C # когда-либо определит его.
Когда вы пишете следующее в F #:
accountRepository.Setup(fun rep ->
rep.Find "aaa" "bbb" "ccc")
Moq на самом деле видит нечто, похожее на:
accountRepository.Setup(fun rep ->
rep.Find("aaa").Invoke("bbb").Invoke("ccc"))
На самом деле, это даже хуже, чем это, потому что F # выполняет оптимизацию, когда компилятор может статически определить количество параметрови сворачивает некоторые вызовы в InvokeFast
call:
accountRepository.Setup(fun rep ->
rep.Find("aaa").InvokeFast("bbb", "ccc"))
Инструмент, который не знает об этом, не может выяснить, что это на самом деле означает вызов Find
с тремя аргументами.
Я думаю, что лучшим вариантом было бы изменить сигнатуру метода (несмотря на то, что вы прямо сказали, что не хотите этого делать).В качестве альтернативы, вы можете добавить облегченную оболочку для тестирования.Еще одним вариантом было бы попробовать библиотеку F # mocking Foq и посмотреть, справится ли она с этим делом лучше.