c# - 使用 nUnit 和 nMocks 进行单元测试

标签 c# unit-testing nunit nmock

一些 nUnit/nMock/单元测试菜鸟问题:

我正在尝试对此类进行单元测试。

我创建了它的模拟,因为我想知道从“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 目前做两件事:转换货币(这很好)和调用外部服务来获取数据(这很糟糕)。您希望您的类(class)具有 single ,易于定义的职责。您的代码将变得更清晰、更易于管理,而且在此上下文中重要的是 - 更易于测试。

将您的数据提供方法 (getCurrencyRates) 重构为外部服务(类)和 inject它到您的转换器对象(例如通过构造函数注入(inject))。

此外,为什么使用 NMocks?它不再积极开发(最后更新似乎是 4-6 years ago ),人们可能会认为它不像现代框架那样容易使用,例如 FakeItEasyMoq .

关于c# - 使用 nUnit 和 nMocks 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9289836/

相关文章:

.net - nunit中的Explicit和Ignore属性之间有什么区别

c# - 使用 NUnit 进行测试时应该如何处理数据文件?

c# - 如果我的代码是为 x86 或任何 CPU 编译的,我的代码如何在运行时检测到

c# - 长时间保持 C# Filestream 打开是否安全?

c# - Azure 函数 - 在 Azure 存储中找不到方法

angular - 如何测试 style.background-color 属性

c# - 有没有办法在 C# 代码 (Linq-to-sql) 中获取两点之间检索的所有数据

c# - 如何使用通用的 getter 和 setter 设置只读属性的值?

c# - 如何为数据网格的 NewItemPlaceholder 行添加模板?

java - Java项目中所有类的单元测试可序列化性