Модульное тестирование с EF Core и в базе данных памяти

Здесь вы идете.

<script type="text/javascript">
        ExecuteOrDelayUntilScriptLoaded(getUserGroup, "sp.js");

        //found online
        function getUserGroup() {
            var context = new SP.ClientContext.get_current();
            var web = context.get_web();
            context.load(web);

            var currUser = web.get_currentUser();
            context.load(currUser);

            var groups = web.get_siteGroups();
            context.load(groups);

            context.executeQueryAsync(
                Function.createDelegate(this,
                    function () {

                        var isInGroup = false;
                        var groupEnumerator = groups.getEnumerator();

                        while (groupEnumerator.moveNext() && !isInGroup) { //go through all the groups
                            var oGroup = groupEnumerator.get_current(); //get current group in the enumerator

                            if (oGroup.get_title() == "SPM Team") { //is the group title named this?
                                var collUser = oGroup.get_users(); //get all the users in the group

                                context.load(collUser);
                                context.executeQueryAsync(
                                    Function.createDelegate(this,
                                        function () {
                                            var userEnumerator = collUser.getEnumerator(); //get the enumeration
                                            while (userEnumerator.moveNext() && !isInGroup) { //go through all users in group
                                                oUser = userEnumerator.get_current(); //get current user in the enumerator
                                                if (oUser.get_id() == currUser.get_id()) { //is the user's id the same as the viewer?
                                                    isInGroup = true;
                                                    console.log("success");
                                                }
                                            }
                                        }),
                                    Function.createDelegate(this,
                                        function (sender, args) {
                                            console.log(args);
                                        }));

                            }
                        }
                    }),
                Function.createDelegate(this,
                    function OnFailure() {
                        console.log("nope");
                    }));
        }
    </script>
2
задан MarcosF8 19 January 2019 в 06:55
поделиться

4 ответа

Похоже, что вам может понадобиться классовое приспособление .

Когда использовать: , когда вы хотите создать отдельный контекст теста и поделиться им среди всех тестов в классе и очистить его после завершения всех тестов в классе .

Создайте отдельный класс для настройки любых данных, которые будут использоваться вашими тестами, и для их очистки после завершения тестов.

public class MovieSeedDataFixture : IDisposable
{
    public MovieDbContext MovieContext { get; private set; } = new MovieDbContext();

    public MovieSeedDataFixture()
    {
        MovieContext.Movies.Add(new Movie { Id = 1, Title = "Movie 1", YearOfRelease = 2018, Genre = "Action" });
        MovieContext.Movies.Add(new Movie { Id = 2, Title = "Movie 2", YearOfRelease = 2018, Genre = "Action" });
        MovieContext.Movies.Add(new Movie { Id = 3, Title = "Movie 3", YearOfRelease = 2019, Genre = "Action" });
        MovieContext.SaveChanges();
    }

    public void Dispose()
    {
        MovieContext.Dispose();
    }
}

Затем используйте его в своих тестах, расширив интерфейс IClassFixture<T>.

public class UnitTests : IClassFixture<MovieSeedDataFixture>
{
    MovieSeedDataFixture fixture;

    public UnitTests(MovieSeedDataFixture fixture)
    {
        this.fixture = fixture;
    }

    [Fact]
    public void TestOne()
    {
        // use fixture.MovieContext in your tests

    }
}
0
ответ дан Grant 19 January 2019 в 06:55
поделиться

Тест выдает большую ошибку с использованием класса фикстуры:

Message: System.AggregateException : One or more errors occurred. (No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.) (The following constructor parameters did not have matching fixture data: MovieSeedDataFixture fixture)

---- System.InvalidOperationException: для этого DbContext не настроен поставщик базы данных. Поставщик может быть настроен путем переопределения метода DbContext.OnConfiguring или с помощью AddDbContext в поставщике службы приложений. Если используется AddDbContext, то также убедитесь, что ваш тип DbContext принимает объект DbContextOptions в своем конструкторе и передает его базовому конструктору для DbContext. ---- Следующие параметры конструктора не имеют совпадающих данных фикстуры: MovieSeedDataFixture fixture

Я создал пустой конструктор для использования класса фикстуры, но, полагаю, необходимо использовать конструктор с параметрами: [114 ]

public class MovieDbContext: DbContext
{
    public MovieDbContext()
    {
    }

    public MovieDbContext(DbContextOptions<MovieDbContext> options) : base(options)
    {

    }

    public DbSet<Movie> Movies { get; set; }
}
0
ответ дан MarcosF8 19 January 2019 в 06:55
поделиться

Спасибо, я сделал некоторые изменения в классе приборов и работает нормально, даже когда я запускаю оба теста вместе.

Вот изменение:

public class MovieSeedDataFixture : IDisposable
{
    public MovieDbContext MovieContext { get; private set; }

    public MovieSeedDataFixture()
    {
        var options = new DbContextOptionsBuilder<MovieDbContext>()
            .UseInMemoryDatabase("MovieListDatabase")
            .Options;

        MovieContext = new MovieDbContext(options);

        MovieContext.Movies.Add(new Movie { Id = 1, Title = "Movie 1", YearOfRelease = 2018, Genre = "Action" });
        MovieContext.Movies.Add(new Movie { Id = 2, Title = "Movie 2", YearOfRelease = 2018, Genre = "Action" });
        MovieContext.Movies.Add(new Movie { Id = 3, Title = "Movie 3", YearOfRelease = 2019, Genre = "Action" });
        MovieContext.SaveChanges();
    }

    public void Dispose()
    {
        MovieContext.Dispose();
    }
}
0
ответ дан MarcosF8 19 January 2019 в 06:55
поделиться

Вы можете решить проблему, добавив метку времени к имени базы данных.

var myDatabaseName = "mydatabase_"+DateTime.Now.ToFileTimeUtc();

var options = new DbContextOptionsBuilder<BloggingContext>()
                .UseInMemoryDatabase(databaseName: myDatabaseName )
                .Options;

Хотя я не видел этого в документации, похоже, в памяти создается только одна база данных с заданным именем. Следовательно, если у вас одно имя, такое исключение может произойти.

Подобное обсуждение есть в этой теме :

optionsBuilder.UseInMemoryDatabase("MyDatabase"); 

Это создает / использует базу данных с именем «MyDatabase». Если UseInMemoryDatabase вызывается снова с тем же именем, то будет использоваться одна и та же база данных в памяти, что позволит ей совместно использовать несколько экземпляров контекста.

И эта проблема github также предлагает такой же подход для добавления уникальной строки с именем базы данных. Надеюсь, это поможет.

0
ответ дан Manoj Choudhari 19 January 2019 в 06:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: