簡體   English   中英

使用nUnit和nMocks進行單元測試

[英]Unit test with nUnit and nMocks

一下nUnit / nMock / Unit測試noobie問題:

我正在嘗試對這門課進行單元測試。

我創建了一個模擬器,因為我想知道“getCurrencyRates”返回的值,以便我可以根據該數據創建測試。

所以我創建了一個這個對象的模擬(只是為了能夠知道返回的匯率)。

...但是現在我也想在這個類上調用一些其他方法。

我是不是該:

a)以某種方式從模擬對象調用實際方法(甚至不確定是否可能)b)重構,以便只有Web服務調用在它自己的對象中並創建一個模擬c)其他東西?

public class CurrencyConversion : ICurrencyConversion
{
    public decimal convertCurrency(string fromCurrency, string toCurrency, decimal amount)
    {

        CurrencyRateResponse rates = getCurrencyRates();
        var fromRate = getRate(rates, fromCurrency);
        var toRate = getRate(rates, toCurrency);

        decimal toCurrencyAmount = toRate / fromRate * amount;

        return toCurrencyAmount;
    }


    public int addNumbers(int i, int j)
    {
        return i + j;

    }

    public decimal getRate(CurrencyRateResponse rates, string fromCurrency)
    {

        if (rates.rates.ContainsKey(fromCurrency))
        {
            return rates.rates[fromCurrency];
        }
        else
        {
            return 0;
        }
    }
    public CurrencyRateResponse getCurrencyRates()
    {
        HttpWebRequest webRequest = GetWebRequest("http://openexchangeerates.org/latest.json");

        HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
        string jsonResponse = string.Empty;
        using (StreamReader sr = new StreamReader(response.GetResponseStream()))
        {
            jsonResponse = sr.ReadToEnd();
        }

        var serializer = new JavaScriptSerializer();
        CurrencyRateResponse rateResponse = serializer.Deserialize<CurrencyRateResponse>(jsonResponse);

        return rateResponse;

    }
    public HttpWebRequest GetWebRequest(string formattedUri)
    {
        // Create the request’s URI.
        Uri serviceUri = new Uri(formattedUri, UriKind.Absolute);

        // Return the HttpWebRequest.
        return (HttpWebRequest)System.Net.WebRequest.Create(serviceUri);
    }
}

您的CurrencyConverter目前做了兩件事 :轉換貨幣(這是好的)並調用外部服務來獲取數據(這是不好的)。 您希望您的課程具有單一 ,易於定義的職責。 您的代碼將更清晰,更易於管理,並且在這種情況下重要的是 - 更可測試。

將數據提供方法( getCurrencyRates )重構為外部服務(類)並將其注入轉換器對象(例如通過構造函數注入 )。

還有,為什么要NMocks? 它不再被積極開發(最近的更新似乎是4 - 6年前 ),人們可能會認為它不像現代框架那樣容易使用,例如FakeItEasyMoq

你會想做像b)這樣的事情。 如果您正在測試對象,則不希望模擬對象本身,而是依賴於它。

您要模擬的依賴項是對Web服務的調用,因為在nunit測試中放置真正的Web服務調用會違反單元測試,並且是實現的噩夢。

為涉及webserice調用的部分創建一個接口

ICurrencyRateService 
{
     CurrencyRateResponse GetCurrencyRates()
}

然后將所有webservicey代碼放入一個實現此目的的對象中。

應該允許您測試ConvertCurrency。 它還意味着您的對象之間可以更好地分離關注點,您有一個調用Web服務的對象,以及一個執行計算的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM