在Xamarin中使用Moq进行NUnit单元测试

时间:2019-01-09 08:49:30

标签: xamarin xamarin.forms mocking nunit moq

我正在使用两个接口在Xamarin App中进行日志记录(NLog)

ILoggingService

public interface ILoggingService
{
    void Info(string message);
    void Info(string format, params object[] args);

    void Error(string message);
    void Error(string format, params object[] args);
    void Error(Exception e, string message);
    void Error(Exception e, string format, params object[] args);

    void Fatal(string message);
    void Fatal(string format, params object[] args);
    void Fatal(Exception e, string message);
    void Fatal(Exception e, string format, params object[] args);

    void Debug(string message);
    void Debug(string format, params object[] args);

    void Trace(string message);
    void Trace(string format, params object[] args);

    void Warn(string message);
    void Warn(string format, params object[] args);
}

另一个界面

ILogManager

public interface ILogManager
{
      ILoggingService GetLog([System.Runtime.CompilerServices.CallerFilePath]string callerFilePath = "");
}

在我的测试项目中,我创建了这样的安装文件。

[SetUpFixture]
public class Setup
{
    public static readonly Mock<IDependencyService> MockedService = new Mock<IDependencyService>(MockBehavior.Strict);
    readonly Mock<ILogManager> _logManager = new Mock<ILogManager>(MockBehavior.Strict);
    readonly Mock<ILoggingService> _loggingService = new Mock<ILoggingService>(MockBehavior.Strict);

    [OneTimeSetUp]
    public void OneTimeSetUp()
    {
        MockedService.Setup(p => p.Get<ILogManager>()).Returns(_logManager.Object);
        MockedService.Setup(p => p.Get<ILoggingService>()).Returns(_logManager.Object.GetLog());
    }

    [OneTimeTearDown]
    public void OneTimeTearDown()
    {

    }
}

我认为我在模拟界面时犯了一些错误。因此,我使GetLog()始终为空。

logger = _serviceLocator.Get<ILogManager>().GetLog(); // Always return null

有人可以指导我解决我的问题吗?在为上述接口创建存根时似乎有些问题。

请帮助

1 个答案:

答案 0 :(得分:3)

日志管理器模拟从未配置为为其GetLog成员返回任何内容。因此,调用时它将返回null。

[OneTimeSetUp]
public void OneTimeSetUp() {

    _logManager.Setup(_ => _.GetLog(It.IsAny<string>())).Returns(_loggingService.Object);

    MockedService.Setup(p => p.Get<ILogManager>()).Returns(_logManager.Object);
    MockedService.Setup(p => p.Get<ILoggingService>()).Returns(_loggingService.Object);
}

您必须设置预期在测试时被调用的成员的行为,否则它们将默认为其默认返回类型,在这种情况下将为null。