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