微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用MsTest的Moq静态隐式运算符

如何解决使用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 举报,一经查实,本站将立刻删除。