Я просто столкнулся с той же проблемой, когда издевался struct
.
Я получаю сообщение об ошибке:
TypeError: перехват классов, которые не наследуются от BaseException, не допускается
При попытке отловить struct.error
, поднятый из struct.unpack
.
Я обнаружил, что самым простым способом обойти это в моих тестах было просто установить значение атрибута ошибки в моем макете равным Exception
. Например,
Метод, который я хочу проверить, имеет следующий базовый шаблон:
def some_meth(self):
try:
struct.unpack(fmt, data)
except struct.error:
return False
return True
Тест имеет этот базовый шаблон.
@mock.patch('my_module.struct')
def test_some_meth(self, struct_mock):
'''Explain how some_func should work.'''
struct_mock.error = Exception
self.my_object.some_meth()
struct_mock.unpack.assert_called()
struct_mock.unpack.side_effect = struct_mock.error
self.assertFalse(self.my_object.some_meth()
Это похоже на подход, принятый @BillB, но он, безусловно, проще, так как мне не нужно добавлять импорт в мои тесты и все равно работать так же. Мне кажется, это логичное завершение общей цепочки рассуждений в ответах здесь.
Неважно ... сконфигурировал параметр источника данных так, чтобы он принимал значение другого элемента управления ..
Вы можете установить значение вашего параметра следующим образом:
SqlParameter parameter1 = new SqlParameter("@ClientID", SqlDbType.BigInt);
parameter1.Value = 32;
SqlDataSource2.SelectParameters.Add(parameter1);
Чтобы заставить его работать, нужно удалить параметр, который вы пытаетесь использовать, перед его добавлением. Следующая адаптированная версия вашего кода должна работать:
' NOTE that there is no "@" sign when you use your parameters in the code
Parameter p = strCommandSqlDataSource2.SelectParameters["ClientID"]
strCommandSqlDataSource2.SelectParameters.Remove(p)
strCommandSqlDataSource2.SelectParameters.Add("ClientID", iClientID)
Вы не должны использовать знак «@» при именовании параметров в части кода, в которой они используются. Вы должны использовать его только в строке SQLCOMMAND.
Надеюсь, это поможет.
Вы можете обойти это с помощью события Selecting в SqlDataSource. Теперь, как можно ограничить разочарование в таких элементах управления !!!
Другой альтернативой было бы добавить HiddenField в ваша форма, и SqlDataSource может получить оттуда свое значение.
Вот версия VB:
Dim parameter As New System.Web.UI.WebControls.Parameter("ClientID", Data.DbType.Int32)
parameter.DefaultValue = 45
sqlTicketInfo.SelectParameters.Add(parameter)
В версии VB.NET не было возможности установить значение, поэтому вместо этого я установил значение по умолчанию. Значение по умолчанию используется, если значение не инициализировано, поэтому, поскольку мы не можем установить значение, оно в любом случае автоматически будет использовать значение по умолчанию.