我需要编写一个单元测试来测试输入是否是有效的货币值。我已经尝试了几种方法,但我认为这不是测试货币价值的正确方法。
测试用例:namespace validationUnitTest
{
// Validation rule for checking if the input is a valid currency value
public class CurrencyValidationRule: ValidationRule;
{
private static ValidationRule validationRule;
/// Singleton instance of this <see cref="ValidationRule"/>
public static ValidationRule Instance { get { return validationRule ?? (validationRule = new CurrencyValidationRule()); } }
// performs validation checks on a value
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (value is double) return ValidationResult.ValidResult;
string stringValue = value as string;
double result;
return string.IsNullOrEmpty(stringValue) || double.TryParse(stringValue, NumberStyles.Currency, cultureInfo, out result) ? ValidationResult.ValidResult : new ValidationResult(false, "Value must be an number");
}
}
}
单元测试:namespace validationUnitTest.Tests
{
[TestClass()]
public class CurrencyValidationRuleTests
{
[TestMethod()]
public void ValidateTest()
{
var test = new CurrencyValidationRule();
var expected = new ValidationResult(true, true);
var actual = test.Validate("0", null);
Assert.AreEqual(expected.ErrorContent, actual.ErrorContent);
Assert.AreEqual(expected.IsValid, actual.Isvalid);
Assert.AreEqual(expected.GetHashCode(), actual.GetHashCode());
}
}
}
关于我应该如何开始我的单元测试,或者我应该搜索什么有任何想法吗?我需要一些起点。任何东西我都很感激。
using System;
using System.Linq;
using Xunit;
using MonthlyStatements.Controllers;
using MonthlyStatements.Models;
using System.IO;
using System.Web.Mvc;
namespace UnitTestProject1
{
public class UnitTest1
{
[Theory]
[InlineData(10.20, "System.Double")]
[InlineData(0, "System.Double")]
public void checkValidation(double amt, string ExpectedResult)
{
//Arrange
string actualResult = "";
//Act
//double doubleAmt = double.Parse(amt.ToString());
actualResult = amt.GetType().ToString();
//Assert
Assert.Equal(ExpectedResult, actualResult);
}
}
}
使用Xunit而不是nUnit,在开始开发之前我们必须考虑以下
- 规则:1)我们只测试公共方法2)我们必须知道输入参数和输出参数如预期结果和实际结果
在上面的代码中你使用了3断言它是不正确的方式,这里你可以检查实际结果的数据类型,使用xunit [InlineData()]
,这样就不需要重复代码。