如何解决使用MsTest的Moq静态隐式运算符
我有一个抽象类Enumeration,它实现了IComparable
接口。
public abstract class Enumeration : IComparable
{
[JsonConstructor]
protected Enumeration(int id,string name)
{
Id = id;
Name = name;
}
public int Id { get; }
public string Name { get; }
public static implicit operator Enumeration(string name)
{
return GetAll<Enumeration>().FirstOrDefault(i => i.Name == name);
}
public static IEnumerable<TEnumeration> GetAll<TEnumeration>() where TEnumeration : Enumeration
{
var fields = typeof(TEnumeration).GetFields(
BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);
return fields.Select(fieldInfo => fieldInfo.GetValue(null)).Cast<TEnumeration>();
}
我创建了SampleStatus.cs
类,该类继承自Enumeration.cs
类。
public class SampleStatus : Enumeration
{
public static readonly SampleStatus Completed = new SampleStatus(1,nameof(Completed));
public static readonly SampleStatus Deleted = new SampleStatus(2,nameof(Deleted));
public SampleStatus(int id,string name) : base(id,name)
{
}
}
我为SampleStatus.cs
类创建了单元测试类。
[TestMethod]
public void TestMethod()
{
// arrange and act
var result = (Enumeration)SampleStatus.GetAll<SampleStatus>().Single(x => x.Id == 1).Name; // output is returning null.
// assert
Assert.AreEqual("Completed",result);
}
当我调用返回空值的GetAll
方法时。我在上面的代码中模拟了GetAll
和隐式运算符方法。
解决方法
在提供的示例中,GetAll
不返回null
(如果返回-我将得到NullReferenceException
)。样本的问题在强制转换为Enumeration
中。 SampleStatus.GetAll<SampleStatus>().Single(x => x.Id == 1).Name
产生Completed
,然后将其强制转换为Enumeration
。由于存在隐式转换,并且基类没有Completed
的定义,(Enumeration)"Completed"
最终为null
(即GetAll<Enumeration>().FirstOrDefault(i => i.Name == name))
)。
例如,您可以通过删除演员表来修复它:
[TestMethod]
public void TestMethod()
{
// arrange and act
var result = SampleStatus.GetAll<SampleStatus>().Single(x => x.Id == 1).Name; // output is returning null.
// assert
Assert.AreEqual("Completed",result);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。