Можно получить некоторую информацию:
Фальшивка объекты на самом деле имеют рабочие реализации, но обычно берут некоторый ярлык, который делает их не подходящими для производства
, Тупики предоставляют консервированные ответы на вызовы, выполненные во время теста, обычно не отвечающего вообще ни на что снаружи, что программируется в для теста. Тупики могут также записать информацию о вызовах, таких как почтовый тупик шлюза, который помнит сообщения, которые она 'отправила', или возможно только, сколько сообщений она 'отправила'.
Насмешки - то, о чем мы говорим здесь: объекты, предварительно запрограммированные с ожиданиями, которые формируют спецификацию вызовов, которые они, как ожидают, получат.
Фальшивка : Мы получаем или создаем очень легкую реализацию той же функциональности в соответствии с компонентом, от которого зависит SUT, и дайте SUT команду использовать его вместо реального.
Тупик : Эта реализация настроена для ответа на вызовы от SUT со значениями (или исключения), который осуществит Непротестированный Код (см. Производственные Ошибки на странице X) в SUT. Ключевой признак для использования Тестового Тупика имеет Непротестированный Код, вызванный неспособностью управлять косвенными исходными данными фиктивного объекта SUT
, который реализует тот же интерфейс как объект, от которого зависит SUT (Система Под Тестом). Мы можем использовать Фиктивный объект в качестве наблюдательного поста, когда мы должны сделать Проверку Поведения, чтобы не иметь Непротестированное Требование (см. Производственные Ошибки на странице X), вызванный неспособностью наблюдать побочные эффекты вызова методов на SUT.
я пытаюсь упростить при помощи: Насмешка и Тупик. Я использую Насмешку, когда это - объект, который возвращает значение, которое установлено к протестированному классу. Я использую Тупик для имитации Интерфейсного или Абстрактного класса, который будет протестирован. На самом деле действительно не имеет значения, что Вы называете им, они - все классы, которые не используются в производстве и используются в качестве служебных классов для тестирования.
Если я правильно понимаю, вам придется сделать картерсианский результат для пользователей и групп и уменьшить результат, полученный от GroupUsers.
Это даст вам записи пользователей, у которых нет любые группы, прикрепленные к нему.
Прошу прощения, если я неправильно понял вопрос.
РЕДАКТИРОВАТЬ: Декартов результат даст вам группы пользователей *. Вам придется вычесть из него GroupUsers. Извините, у меня нет готового SQL для этого, и я не могу попробовать его сейчас.
Вы можете использовать левое внешнее соединение
, чтобы захватить всех пользователей, а затем удалить любого пользователя, к которому присоединена группа. Следующий запрос предоставит вам только список пользователей, для которых нет группы:
select
u.*
from
users u
left outer join groupusers g on
u.userid = g.userid
where
g.userid is null
Если вы хотите найти всех пользователей, не входящих в определенную группу:
select
u.*
from
users u
left outer join groupusers g on
u.userid = g.userid
and g.groupid = @GroupID
where
g.userid is null
Это только исключит пользователей в этой конкретной группе. Все остальные пользователи будут возвращены. Это связано с тем, что условие groupid
было выполнено в предложении join
, которое ограничивает объединенные, а не возвращаемые строки, что и делает предложение where
.