首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可以使用Moq从实例中获取模拟实例吗?

可以使用Moq从实例中获取模拟实例吗?
EN

Stack Overflow用户
提问于 2018-06-13 05:26:11
回答 1查看 4.5K关注 0票数 6

假设我有这个接口和这个类:

代码语言:javascript
复制
public interface IScheduler
{
    void StopTimer();

    // some other methods
}

public class Scheduler : IScheduler
{
    private static readonly IScheduler scheduler = new Scheduler();

    private readonly Timer timer;

    public Scheduler()
    {
        refreshTimer = new Timer
        {
            Enabled = false,
            AutoReset = false
        };
    }

    public static IScheduler GetScheduler()
    {
        return scheduler;
    }

    public void StopTimer()
    {
        timer.Stop();
    }

    // some other methods
}

所以我想知道我是否可以从GetScheduler方法中获得一个模拟实例。我尝试了这样的东西:

代码语言:javascript
复制
[TestMethod]
public void Execute_ButtonClicked_StopTimer()
{
    // arrange
    var mockScheduler = Mock.Get(Scheduler.GetScheduler());
    var command = GetCommandInstance();

    // act
    command.Execute();

    // assert
    mockScheduler.Verify(m => m.StopTimer());
}

但是不起作用,它显示"System.ArgumentException:对象实例不是由Moq创建的。“

有什么建议吗?

在command类中有类似这样的内容:

代码语言:javascript
复制
public void Execute()
{
    // some code
    Scheduler.GetScheduler().StopTimer();
}
EN

回答 1

Stack Overflow用户

发布于 2018-06-13 06:03:50

如果你将试图替换的调用包装在一个虚拟的调用中,你可以这样做:

代码语言:javascript
复制
public class Scheduler : IScheduler
{
    private static readonly IScheduler scheduler = CreateScheduler();

    private readonly Timer timer;

    public Scheduler()
    {
        refreshTimer = new Timer
        {
            Enabled = false,
            AutoReset = false
        };
    }

    public static IScheduler GetScheduler()
    {
        return scheduler;
    }

    public void StopTimer()
    {
        timer.Stop();
    }

    public virtual IScheduler CreateScheduler()
    {
         return new Scheduler();
    }
    // some other methods
}

然后在你的单元测试类中:

代码语言:javascript
复制
[TestClass]
public class TestClass
{
    [TestMethod]
    public void testMethod()
    {
        var scheduler = new Mock<Scheduler>();
        // you can now call .setup on the scheduler instance and use this mock.
        var sut = new SchedulerWrapper(scheduler.Object);

        ///var sut....sometests
    }
}

internal class SchedulerWrapper : Scheduler
{
    private Scheduler _scheduler;
    public SchedulerWrapper(Scheduler scheduler)
    {
         _scheduler;
    }
    public overrride IScheduler CreateScheduler()
    {
         return _scheduler;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50826056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档