1

我将最常创建的模拟移动到扩展和帮助类中,以便能够在多个测试中重用它们。当事实证明它们明显依赖于上下文并且坐在其他地方时不起作用时,我感到非常惊讶。

此代码演示了该问题:

void Main()
{
    // Does not get the mock user.
    var db = MockFactory.MockUserDatabase();        
    db.GetUsersAsync().GetAwaiter().GetResult().Dump(); // <-- null

    // This works and gets the mock user.
    var mock = Mock.Create<IUserDatabase>();
    mock
        .Arrange(x => x.GetUsersAsync())
        .Returns(Task.FromResult(new[] { new User { Name = "John" } }));

    mock.GetUsersAsync().GetAwaiter().GetResult().Dump(); // <-- mock user

}

static class MockFactory
{
    public static IUserDatabase MockUserDatabase()
    {
        var mock = Mock.Create<IUserDatabase>();

        mock
            .Arrange(x => x.GetUsersAsync())
            .ReturnsTask(new[] { new User { Name = "John" } });

        return mock;
    }
}

public static class JustMockHelpers
{
    public static IAssertable ReturnsTask<TReturn>(this IAssertable assertable, TReturn value)
    {
        return assertable.Returns(Task.FromResult<TReturn>(value));
    }
}

public interface IUserDatabase
{
    Task<User[]> GetUsersAsync();
}

public class User
{
    public string Name { get; set; }
}

有什么方法可以使JustMock封装在其他类中的代码也可以工作吗?

4

2 回答 2

1

这里的问题是您使用的是静态 MockFactory 并且当您直接使用它而不是静态地使用它时它可以工作。如果您每次都在启动测试数据并且每次重新创建模拟时,为什么要使用静态类?尝试使用此方法创建一个基本测试类并将其称为 base.YourInitialiseMethod() 或类似 TestFixtures 的东西。如果您查看 JustMock 的文档,他们总是会在每个测试用例中单独创建。

于 2019-07-11T15:03:16.523 回答
0

我发现了一个窍门。您可以static使用Func. ReturnsTask仍然不会合作,但至少总体安排会。

static class MockFactory
{
    public static Func<IUserDatabase> MockUserDatabase
    {
        get
        {
            return () =>
            {
                var mock = Mock.Create<IUserDatabase>();

                mock
                    .Arrange(x => x.GetUsersAsync())
                    .Returns(new[] { new User { Name = "John" } }.ToTask());

                return mock;
            };
        }
    }
}

我把另一个扩展转过来并做到了:

public static Task<T> ToTask<T>(this T obj) => Task.FromResult(obj);

然后我打电话:

.Returns(new[] { new User { Name = "John" } }.ToTask())
于 2019-07-11T15:27:45.483 回答