Dependency injection typemock引发了InvalidCast异常

Dependency injection typemock引发了InvalidCast异常,dependency-injection,typemock,Dependency Injection,Typemock,我截取了以下代码,并尝试使用typemock对其进行测试,但得到了InvalidCast异常。ISomeClass只是一个接口,SomeClass实现了该接口。UseOfSomeClass是另一个使用SomeClass的类,其构造函数以SomeClass为参数。我需要测试某个类的使用情况。如何将typemock伪对象注入类构造函数 public interface ISomeClass { void DoSomething(); } public class SomeClass : I

我截取了以下代码,并尝试使用typemock对其进行测试,但得到了InvalidCast异常。ISomeClass只是一个接口,SomeClass实现了该接口。UseOfSomeClass是另一个使用SomeClass的类,其构造函数以SomeClass为参数。我需要测试某个类的使用情况。如何将typemock伪对象注入类构造函数

public interface ISomeClass
{
    void DoSomething();
}

public class SomeClass : ISomeClass
{
    public void DoSomething()
    {
        Console.WriteLine("Do something!");
    }
}

public class UseOfSomeClass
{
    public SomeClass SomeClassProperty { get; set; }

    public bool IsChecked { get; set; }

    public UseOfSomeClass(SomeClass someClass)
    {
        SomeClassProperty = someClass;
    }

    public void MyMethod()
    {
        SomeClassProperty.DoSomething();

        IsChecked = true;
    }
}
然后测试:

[TestClass]
public class UseOfSomeClassTest
{
    [TestMethod]
    public void TestMethod1()
    {
        var fakeSomeClass = Isolate.Fake.Instance<ISomeClass>();

        var use = new UseOfSomeClass((SomeClass)fakeSomeClass);

        use.MyMethod();

        Assert.IsTrue(use.IsChecked);
    }
}
[TestClass]
SomeClassTest的公共类使用
{
[测试方法]
公共void TestMethod1()
{
var fakeSomeClass=Isolate.Fake.Instance();
var use=SomeClass((SomeClass)fakeSomeClass)的新用途;
使用.MyMethod();
Assert.IsTrue(use.IsChecked);
}
}
谢谢

允许您模拟具体的类,因此无需在测试用例中伪造类。您可以伪造SomeClass并将其作为参数发送给ctor

[TestMethod, Isolated]
public void TestMethod1()
{
    var fakeSomeClass = Isolate.Fake.Instance<SomeClass>();

    var use = new UseOfSomeClass(fakeSomeClass);

    use.MyMethod();

    Assert.IsTrue(use.IsChecked);
}
[测试方法,隔离]
公共void TestMethod1()
{
var fakeSomeClass=Isolate.Fake.Instance();
var use=某些类别(fakeSomeClass)的新用途;
使用.MyMethod();
Assert.IsTrue(use.IsChecked);
}
允许您模拟具体的类,因此无需在测试用例中模拟类。您可以伪造SomeClass并将其作为参数发送给ctor

[TestMethod, Isolated]
public void TestMethod1()
{
    var fakeSomeClass = Isolate.Fake.Instance<SomeClass>();

    var use = new UseOfSomeClass(fakeSomeClass);

    use.MyMethod();

    Assert.IsTrue(use.IsChecked);
}
[测试方法,隔离]
公共void TestMethod1()
{
var fakeSomeClass=Isolate.Fake.Instance();
var use=某些类别(fakeSomeClass)的新用途;
使用.MyMethod();
Assert.IsTrue(use.IsChecked);
}

你不应该模仿
某个类而不是
某个类吗?是的。如果我模仿某个类,它会很好地工作。但是为什么我不应该嘲笑我的课呢?或者什么时候应该模拟接口,什么时候应该模拟具体类?如果类构造函数需要一个
SomeClass
,则需要模拟
SomeClass
。如果需要
isomoclass
,则需要模拟
isomoclass
。通常,当您执行依赖项注入时,您应该更愿意将
UseOfSomeClass
更改为在构造函数中接受
ISomeClass
,而不是
SomeClass
。实际上,您不应该让接口的名称与类类似,它应该表示类实现的契约。这很有意义。ThanksYacoub是对的,您应该模拟某个类,因为它是您的任务所需的对象,您将模拟它作为未来的实例,如下所示:var fakeSomeClass=Isolate.Fake.NextInstance();难道你不应该模仿
SomeClass
而不是
SomeClass
?是的。如果我模仿某个类,它会很好地工作。但是为什么我不应该嘲笑我的课呢?或者什么时候应该模拟接口,什么时候应该模拟具体类?如果类构造函数需要一个
SomeClass
,则需要模拟
SomeClass
。如果需要
isomoclass
,则需要模拟
isomoclass
。通常,当您执行依赖项注入时,您应该更愿意将
UseOfSomeClass
更改为在构造函数中接受
ISomeClass
,而不是
SomeClass
。实际上,您不应该让接口的名称与类类似,它应该表示类实现的契约。这很有意义。ThanksYacoub是对的,您应该模拟某个类,因为它是您的任务所需的对象,您将模拟它作为未来的实例,如下所示:var fakeSomeClass=Isolate.Fake.NextInstance();