【发布时间】:2020-05-24 20:32:48
【问题描述】:
我很难为策略模式编写单元测试。 我正在写一个测试,它将调用 _mathStrategy.Calculate(a, b, Operator.Add) 并返回一个值。 问题是我不知道如何用正确的值实例化数学策略。 有人能告诉我正确的方法吗? 谢谢
public class HomeController : ControllerBase
{
private readonly IMathStrategy _mathStrategy;
public HomeController(IMathStrategy mathStrategy)
{
_mathStrategy = mathStrategy;
}
public IActionResult Index()
{
int a = 10;
int b = 5;
int result = _mathStrategy.Calculate(a, b, Operator.Add);
return Content(result.ToString());
}
}
public interface IMathOperator
{
Operator Operator { get; }
int Calculate(int a, int b);
}
public interface IMathStrategy
{
int Calculate(int a, int b, Operator op);
}
public class MathStrategy : IMathStrategy
{
private readonly IEnumerable<IMathOperator> _operators;
public MathStrategy(IEnumerable<IMathOperator> operators)
{
_operators = operators;
}
public int Calculate(int a, int b, Operator op)
{
return _operators.FirstOrDefault(x => x.Operator == op)?.Calculate(a, b) ?? throw new ArgumentNullException(nameof(op));
}
}
public enum Operator
{
Add,
Substract,
Multiple,
Divide
}
我的测试尝试
public class HomeControllerTest
{
public IMathStrategy MathStrategy;
public HomeControllerTest()
{
MathStrategy = new mathStrategy(new List<IMathOperator>());
}
[Fact]
public void Test1()
{
var s = MathStrategy.Calculate(1, 2, Operator.Add);
}
}
【问题讨论】:
-
为什么阻止您通过 IEnumerable?另外,你的目标是什么?你想模拟策略吗?您想测试策略本身吗?
-
我正在尝试编写一个返回从 MathStrategy 调用的值的单元测试。我不想模拟它。我真的想叫它
-
谁阻止你写
MathStrategy = new MathStrategy(new List<IMathOperator>(){ op1,op2,.. });这样的东西?使用IMathOperator的实际实现@ -
我在正确实现 IMathOperator 时遇到问题
-
IMathOperator的正确实现与 xunit 测试模式无关。您的问题和实际问题不匹配
标签: c# unit-testing xunit