Здесь вы идете.
<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>
Похоже, что вам может понадобиться классовое приспособление .
Когда использовать: , когда вы хотите создать отдельный контекст теста и поделиться им среди всех тестов в классе и очистить его после завершения всех тестов в классе .
blockquote>Создайте отдельный класс для настройки любых данных, которые будут использоваться вашими тестами, и для их очистки после завершения тестов.
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 } }
Тест выдает большую ошибку с использованием класса фикстуры:
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; }
}
Спасибо, я сделал некоторые изменения в классе приборов и работает нормально, даже когда я запускаю оба теста вместе.
Вот изменение:
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();
}
}
Вы можете решить проблему, добавив метку времени к имени базы данных.
var myDatabaseName = "mydatabase_"+DateTime.Now.ToFileTimeUtc();
var options = new DbContextOptionsBuilder<BloggingContext>()
.UseInMemoryDatabase(databaseName: myDatabaseName )
.Options;
Хотя я не видел этого в документации, похоже, в памяти создается только одна база данных с заданным именем. Следовательно, если у вас одно имя, такое исключение может произойти.
Подобное обсуждение есть в этой теме :
optionsBuilder.UseInMemoryDatabase("MyDatabase");
Это создает / использует базу данных с именем «MyDatabase». Если UseInMemoryDatabase вызывается снова с тем же именем, то будет использоваться одна и та же база данных в памяти, что позволит ей совместно использовать несколько экземпляров контекста.
blockquote>И эта проблема github также предлагает такой же подход для добавления уникальной строки с именем базы данных. Надеюсь, это поможет.