Когда у меня есть тип MyType и этот код:
// models.fs
type internal Ticker(price:decimal, time:System.DateTime) =
member this.Price = price
member this.Time = time
// cache.fs
module internal cache
type TickerCache = {date:DateTime; ticker:Ticker}
let cache_duration = TimeSpan.FromSeconds 60.0
let cache_tickers = Dictionary<string, TickerCache>()
let isCached currency_pair =
cache_tickers.ContainsKey currency_pair && (DateTime.UtcNow - cache_tickers.Item(currency_pair).date) < cache_duration
let getTicker currency_pair =
let found, item = cache_tickers.TryGetValue currency_pair
if found && (DateTime.UtcNow - item.date) < cache_duration then Some item.ticker
else None
// Client.fs
namespace main
open Flurl.Http
type MyType =
let getTicker main, base_ =
let pair = sprintf"%s%s" main base_
let cached_ticker = cache.getTicker(pair)
if cached_ticker.IsSome then Task.FromResult(cached_ticker.Value)
else
let url = sprintf"%s/ticker/%s" apiBaseUrl pair
url.GetJsonAsync<Ticker>()
как я могу проверить, что GetJsonAsync вызывается (или нет, в зависимости от результатаиз cache.getTicker )?
Я обычно использую Moq, чтобы проверить, что вызывается определенная Setup , но в этом случае Setup использует метод расширенияСтрока вместо интерфейса, который я могу издеваться.
Предложения о том, как это протестировать?
(решение даже для C # нормально, я постараюсь перейти на F # или написать тест на C #)
[edit] Почему MyType является типом?
Этот код предназначен для генерации клиента, который будет использоваться проектом C # следующим образом:
(MyType Client )
var configuration = new Configuration(tickerCacheTTL, publicKey, secretKey);
IClient client = new Client(configuration);
var ticker = client.getTicker("A", "B");
type генерирует class , и это более ".Net friendly".Кроме того, я не хочу каждый раз передавать конфигурацию в функцию getTicker.
В реальном коде F # я использую: interface IClient with
для предоставления открытых методов.
[edit 2]
Я могу использовать InternalsVisibleToAttribute в моделях.fs (Ticker, TickerCache) и cache.fs:
[<assembly:System.Runtime.CompilerServices.InternalsVisibleTo("MyProject.UnitTests")>]
do()
(и изменить тип TickerCache из частногок внутренним также), но я все еще не могу смоделировать cache.getTicker без надлежащей инъекции в клиент (MyType).